假设我有一个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怎么检查呢?
答案 0 :(得分:46)
你的意思是
obj1.getClass().equals(obj2.getClass())
如果obj1
和obj2
具有相同的特定类别,则应返回true。
但如果您将A
与B extends A
进行比较,则无效。如果你想要等于返回true,即使一个是另一个的子类型,你将不得不写一个更强大的比较函数。我认为您可以通过使用getSuperClass()
循环来实现层次结构树。
我认为一个简单的解决方案也可以A.getClass().isAssignableFrom(B.getClass())
,假设B extends A
。
答案 1 :(得分:6)
你可以做到
if (obj1.getClass() == obj2.getClass()) { ... }
答案 2 :(得分:1)
这样的事情:
if(classA.getClass().getName().equals(classB.getClass().getName()))
<do something>
答案 3 :(得分:0)
由于B,C和D是A的子类,并且您想对这些类执行某些操作,因此我不会使用instanceOf
运算符。这个只有在没有别的办法时才有用。
你可以更好地覆盖超级方法和/或变量,这样你就可以使用相同的所有对象,他们会做出不同的事情(例如打印它自己的类型)。
答案 4 :(得分:-2)
instanceof需要指向一个类,而不是另一个对象。要检查两个对象是否来自同一类型的对象,请执行以下操作。
if((obj1 instanceof ClassName) && (obj2 instanceof ClassName)) {
do whatever
}