2

私は次のようなことをしようとしていました

class O has a child E

変数を宣言します

O xyz = new E();

しかし、xyz.method()を呼び出すと、クラスOのメソッドでのみ呼び出すことができ、Eのメソッドでは呼び出せないため、次のようにダウンキャストできます。

E xyz2 = (E) xyz;

私の質問は-新しい変数を宣言せずにこれを行うことができますか?何かのようなもの:

O xyz = new E();
xyz = (E) xyz; 

これで、xyz.method()を使用してEのメソッドを呼び出すことができます

Javaでこれを行う方法はありますか?

4

4 に答える 4

7

はい、あなたはダウンキャストすることができます

((E)xyz).method();
于 2011-01-31T05:46:45.907 に答える
1

いいえ、宣言後に変数の型を変更することはできません。

タイプキャストをインライン化できます。これにより、ダウンキャストを1回だけ行う必要がある場合に、入力をいくらか節約できます。

Number n = 1;
((Integer)n).someIntegerMethod();

ただし、それを複数回行う必要がある場合は、おそらく新しい変数を作成する必要があります。コンパイラは、これを適切に最適化するのに十分賢い場合とそうでない場合があります(そして、繰り返しクラスキャストの実行時オーバーヘッドが発生します)。

于 2011-01-31T05:48:19.213 に答える
0

親クラス(O)にもメソッドxyzがある場合は、次のように呼び出すことができます。

O xyz = new E();
xyz.method();   // E's xyz would be called

これはポリモーフィズムです

于 2011-01-31T05:47:12.960 に答える
0

あなたはこのようにそれをすることはできません:

O xyz = new E();
xyz = (E) xyz; 
xyx.someEMethod(); // compilation error

その理由は、Javaオブジェクトのタイプキャストは実際には値を変更しないためです。むしろ、オブジェクトの実際のタイプに対してタイプチェックを実行します。

コードはの値がであるかどうかをチェックしますがxyzE型キャストの結果を(2番目のステートメント)に割り当てxyz、それによってO再びにアップキャストします。

ただし、これを行うことができます。

((E) xyx).someEMethod(); // fine

'。'であるため、型キャストを囲む括弧は必須です。演算子は型キャストよりも優先されます。

于 2011-01-31T06:22:38.447 に答える