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。
但是如果我只想检查两个引用是否指向同一种对象呢?
所以像:

if(obj1 instanceof obj2)
   <do something>

但是当然语法是错误的。如何在没有一千个 if-else 的情况下检查这个?

4

5 回答 5

62

你的意思是

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

仅当两者都属于同一特定类时,obj1这才应返回 true 。obj2

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 需要指向一个类,而不是另一个对象。要检查两个对象是否都来自同一类型的对象,请执行以下操作..

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