[解決済み] クラス変数に関するアップキャスティングとダウンキャスティングの違いを教えてください。
質問
クラス変数に関するアップキャスティングとダウンキャスティングの違いは何ですか?
例えば、次のプログラムでは、Animalクラスにはメソッドが1つしかありませんが、Dogクラスには2つのメソッドがあります。
もし、キャスティングが行われた場合、Animalの変数でDogの別のメソッドを呼び出すにはどうすればよいのでしょうか。
class Animal
{
public void callme()
{
System.out.println("In callme of Animal");
}
}
class Dog extends Animal
{
public void callme()
{
System.out.println("In callme of Dog");
}
public void callme2()
{
System.out.println("In callme2 of Dog");
}
}
public class UseAnimlas
{
public static void main (String [] args)
{
Dog d = new Dog();
Animal a = (Animal)d;
d.callme();
a.callme();
((Dog) a).callme2();
}
}
解決方法は?
アップキャスティングはスーパータイプへのキャスト、ダウンキャスティングはサブタイプへのキャストです。アップキャストは常に許可されますが、ダウンキャストは型チェックが行われ
ClassCastException
.
あなたの場合
Dog
を
Animal
はアップキャストであるため
Dog
は
Animal
. 一般に、2つのクラスの間にis-a関係がある場合は、いつでもアップキャストすることができます。
ダウンキャストは、こんな感じでしょうか。
Animal animal = new Dog();
Dog castedDog = (Dog) animal;
基本的に、あなたがしていることは、オブジェクトの実行時の型が何であるかを知っていることをコンパイラに伝えることです。
本当に
です。コンパイラは変換を許可しますが、変換が意味をなすかどうかを確認するために、実行時のサニティチェックを挿入します。この場合、キャストが可能なのは、実行時に
animal
は、実際には
Dog
の静的な型であっても
animal
は
Animal
.
しかし、仮にこうすると
Animal animal = new Animal();
Dog notADog = (Dog) animal;
を取得することになります。
ClassCastException
. なぜかというと
animal
のランタイム型は
Animal
そのため、ランタイムにキャストを実行するように指示すると
animal
は実際には
Dog
を投げるので
ClassCastException
.
スーパークラスのメソッドを呼び出すには、次のようにします。
super.method()
またはアップキャストを実行することで。
サブクラスのメソッドを呼び出すには、ダウンキャストを行う必要があります。上に示したように、通常は
ClassCastException
を使用することができます。
instanceof
演算子でオブジェクトの実行時型を確認してからキャストを行うことで、そのオブジェクトの
ClassCastException
s:
Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
if (animal instanceof Dog) {
// Guaranteed to succeed, barring classloader shenanigans
Dog castedDog = (Dog) animal;
}
ダウンキャストは、Java 16以降、より簡潔に表現できるようになり、次のようなものが導入されました。
のパターンマッチングを行います。
instanceof
:
Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
if (animal instanceof Dog castedDog) {
// now castedDog is available here as in the example above
}
関連
-
[解決済み] Cloneable throws CloneNotSupportedException
-
[解決済み] Java- <T extends Comparable<T>>の意味?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] Javaクラスにおけるcanonical name、simple name、class nameの違いは何ですか?
-
[解決済み] JDKとJREの違いは何ですか?
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Androidアプリがアクティビティを開始できない コンポーネントinfo
-
[解決済み] JVMフラグCMSClassUnloadingEnabledは、実際に何をするのですか?
-
[解決済み] getContentPane()は具体的に何をするのですか?
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] javac ソースファイルが見つかりません
-
[解決済み] 最も近い整数への切り捨て - 私は不正をしているのでしょうか、それともこれは十分すぎるほど適切なのでしょうか?
-
[解決済み] JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違いについて
-
[解決済み] アクティビティに割り当てられない
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] Maven: assembly-pluginが全く実行されない