2011-01-31 12 views
2

は、私は、変数あなたは新しい変数を宣言することなくJavaのオブジェクトをダウンキャストできますか?

O xyz = new E(); 

が、私はxyz.method()を呼び出した場合、その後、私は唯一のクラスOの方法ではなく、E年代にそれらを呼び出すことができますを宣言

class O has a child E 

ような何かをしようとしていましたので、私はそれをダウンキャストすることができます

​​

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

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

、今私は

Eのメソッドを呼び出すために)(xyz.method使用することができますは、Javaでこれを行うにはそこに方法は何ですか?

+0

@Leonが指摘しているように、後で同じスコープ内で 'xyz'を' E'型にする必要がある場合は、 'O xyz = new E()'を書くことは決してありませんが、 E xyz = new E() 'である。しかし、あなたの実際のコードはこの例よりも難しいと思います。 – Thilo

答えて

7

はいあなたは

((E)xyz).method(); 
0

をダウンキャストすることができ、親クラス(O)は、同様の方法のXYZを持っていた場合、あなただけの

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

を呼び出すことができます。これは、多型

+0

しかし、彼はこれはそうではないと言いました。サブクラスだけが呼び出したいメソッドを持っています。 – Thilo

+1

それから彼はE xyz = new E()を宣言するか、またはOで抽象メソッドxyzを作成するだけです。この質問のタグは多形性であり、これは多形性の行動です – Leon

+1

(実際に必要とするタイプの変数を宣言する)ことが最良の方法でしょう。私はこれが単純な例であると仮定しています。 – Thilo

0

Noで、変数が宣言された後で変数の型を変更することはできません。

あなたは一度だけダウンキャストする必要がある場合は、いくつかのタイピングを節約型キャストを、インライン化することができます:あなたが複数回あることを行うために必要がある場合は、おそらくしかし、新しい変数を作成する必要があります

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

。コンパイラは、そうでなければこれを適切に最適化するのに十分なほど巧妙であるかもしれないし、そうでないかもしれない(繰り返しクラスキャストのランタイムオーバヘッドを招く)。

0

あなたはこのようにそれを行うことはできません。

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

理由は、Javaオブジェクトの型キャストは、実際に任意の値を変更しないことです。むしろ、オブジェクトの実際の型に対して型チェックを実行します。

コードはxyzの値がEであることを確認し、その後、それにより再びOにそれをアップキャスト、バックxyz(第2文)に型キャストの結果を割り当てます。

しかし、あなたはこれを行うことができますので、型キャストの周り

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

括弧は、必要不可欠です「」演算子は型キャストよりも高い優先度を持ちます。

関連する問題