[解決済み] スーパークラスからサブクラスへの明示的なキャスト
2022-04-23 05:35:49
質問
public class Animal {
public void eat() {}
}
public class Dog extends Animal {
public void eat() {}
public void main(String[] args) {
Animal animal = new Animal();
Dog dog = (Dog) animal;
}
}
課題
Dog dog = (Dog) animal;
はコンパイルエラーを発生させませんが、実行時に
ClassCastException
. なぜコンパイラはこのエラーを検出できないのでしょうか?
解決方法は?
キャストを使用することは、本質的にコンパイラに「私を信じてください」と伝えていることになります。私はプロフェッショナルで、自分が何をしているのか分かっていますし、保証はできませんが、次のことを伝えているのです。
animal
変数は間違いなく犬になる。
この動物は実際には犬ではないので(動物だから
Animal animal = new Dog();
というのも、あなたは信頼に背いたからです(あなたはコンパイラにすべて大丈夫だと言ったのに、そうではなかったのです!)。
もし、異なる継承階層のオブジェクトをキャストしようとすると(たとえば、犬を文字列にキャストする)、コンパイラは、それがうまくいくはずがないことを知っているので、あなたに投げ返します。
基本的にはコンパイラから文句を言わせないようにするだけなので、キャストのたびに
ClassCastException
を使用することで
instanceof
をif文の中に入れる(あるいはそのような趣旨のことをする)。
関連
-
Methodのinvokeメソッド実装のJavaリフレクション
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] ダイレクトキャスト vs 'as'演算子?
-
[解決済み] Javaでlongをintに安全にキャストする
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
[解決済み] Javaにおけるダウンキャスティング
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
IDEA パッケージステートメントの欠落
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
ローカルリソースのロードが許可されていない場合の解決策
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。