2016-05-10 16 views
1

Questionというクラスがあり、そこでequalsメソッドをオーバーライドしたいとしましょう。私は、これらのオブジェクトのうちの2つが属性 'number'が両方とも同じ場合、同じオブジェクトになるようにしたいと思います。Java:メソッドのオーバーライドと型キャスト

ここで、 'o'がQuestionのインスタンスである場合、if条件で既にチェックした場合、型キャストを "(Question)o"にしなければならないのはなぜですか?

public boolean equals(Object o) { 
    if(o instanceof Question) { 
     return ((Question) o).number == number; 
    } 
    return false; 
} 
+3

Javaは十分にスマートではありません。例えば、スウィフトはこれを行うことができると信じています。 –

+1

ええ、このような推論はそれほど簡単ではないと言及していません。 'o'はfinalではないので、その値はifブロック内の別のインスタンスに変更することができます。例えば、 – Mifeet

+1

A、B、C 3クラス、BとCはAを拡張し、Bはcolorという名前の変数、 Cは変数名エンジンを持っていますが、instanceOfは(B instanceOf A、C instanceOf A)に対してtrueを返しますが、使用する変数がBでないことを確認するためにキャストする必要があります。キャストではありません。私が働いているインスタンスはBではないC –

答えて

2

instanceof演算子は、単にそれがQuestionのインスタンスであるかどうかを確認するために、オブジェクトoのチェックを行います。我々はすでにObjectと指定しているので、oの状態または型の突然変異は行われません。ちょうど次の行に進み、

public boolean equals(Object o) { 

JVMチェックoQuestionのインスタンスである場合:

0

は、次の中Object oのパラメータを与えます。

if(o instanceof Question) { 

しかし、それは次の行に来るとき、あなたはまだObjectようなタイプを宣言しているので、数がQuestionクラスの属性である場合、コンパイラはエラーとしてそれをキャッチします。

return ((Question) o).number == number; 
    } 
    return false; 
} 

宣言された型の詳細については、click here.

関連する問題