web-dev-qa-db-ja.com

2つのオブジェクトが同じタイプかどうかを確認します

クラス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なしでこれを確認するにはどうすればよいですか?

21
Ramy Al Zuhouri

あなたは次のようなものを意味します

_obj1.getClass().equals(obj2.getClass())
_

_obj1_と_obj2_の両方が同じ特定のクラスのものである場合にのみ、これはtrueを返します。

しかし、Aを_B extends A_と比較している場合、これは機能しません。 1つが別のサブタイプであってもtrueを返す等式が必要な場合は、より強力な比較関数を作成する必要があります。 getSuperClass()でループして階層ツリーを上に行くと、それができると思います。

単純な解決策は、_B extends A_であると仮定して、A.getClass().isAssignableFrom(B.getClass())を実行することもできると思います。

50
Jack

あなたができる

if (obj1.getClass() == obj2.getClass()) { ... }
6
kba

このようなもの:

if(classA.getClass().getName().equals(classB.getClass().getName()))
     <do something>
1
Kennet

B、C、DはAのサブクラスであり、これらのクラスで何かをしたいので、instanceOf演算子は使用しません。これは他に方法がない場合にのみ役立ちます。

スーパーメソッドや変数をオーバーライドして、すべてのオブジェクトを同じように使用できるようにすることもできます。ただし、オブジェクトが何か違うことをするのは難しいです(たとえば、独自のタイプを出力するなど)。

0
user717572