クラスAがあり、B、C、DがAから派生しているとしましょう。
参照されるオブジェクトのタイプを知りたい場合は、次のように宣言できます。
// pseudo-code
if(obj instanceof B)
< is B>
else if(obj instanceof C)
< is C>
else
<is D>
これは、Aから派生したクラスがB、C、およびDのみであることを確信しているためです。
しかし、2つの参照が同じ種類のオブジェクトを指していることを確認したいだけの場合はどうなりますか?
そのようなもの:
if(obj1 instanceof obj2)
<do something>
しかし、もちろん構文は間違っています.1000個のif-elseなしでこれを確認するにはどうすればよいですか?
あなたは次のようなものを意味します
_obj1.getClass().equals(obj2.getClass())
_
_obj1
_と_obj2
_の両方が同じ特定のクラスのものである場合にのみ、これはtrueを返します。
しかし、A
を_B extends A
_と比較している場合、これは機能しません。 1つが別のサブタイプであってもtrueを返す等式が必要な場合は、より強力な比較関数を作成する必要があります。 getSuperClass()
でループして階層ツリーを上に行くと、それができると思います。
単純な解決策は、_B extends A
_であると仮定して、A.getClass().isAssignableFrom(B.getClass())
を実行することもできると思います。
あなたができる
if (obj1.getClass() == obj2.getClass()) { ... }
このようなもの:
if(classA.getClass().getName().equals(classB.getClass().getName()))
<do something>
B、C、DはAのサブクラスであり、これらのクラスで何かをしたいので、instanceOf
演算子は使用しません。これは他に方法がない場合にのみ役立ちます。
スーパーメソッドや変数をオーバーライドして、すべてのオブジェクトを同じように使用できるようにすることもできます。ただし、オブジェクトが何か違うことをするのは難しいです(たとえば、独自のタイプを出力するなど)。