26

クラス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なしでこれをチェックする方法は?

4

5 に答える 5

62

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

obj1.getClass().equals(obj2.getClass())

obj1これは、との両方obj2が同じ特定のクラスである場合にのみ true を返す必要があります。

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

A.getClass().isAssignableFrom(B.getClass())と仮定すると、簡単な解決策も実行できると思いますB extends A

于 2012-04-15T14:22:14.013 に答える
6

あなたができる

if (obj1.getClass() == obj2.getClass()) { ... }
于 2012-04-15T14:21:42.823 に答える
1

このようなもの:

if(classA.getClass().getName().equals(classB.getClass().getName()))
     <do something>
于 2012-04-15T14:28:13.383 に答える
0

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

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

于 2012-04-15T14:26:55.870 に答える
-2

instanceofは、別のオブジェクトではなく、クラスを指す必要があります。2つのオブジェクトが両方とも同じタイプのオブジェクトからのものであることを確認するには、次のことを行います。

if((obj1 instanceof ClassName) && (obj2 instanceof ClassName)) {
  do whatever
}
于 2012-04-15T14:23:54.927 に答える