2012-04-15 115 views
17

假设我有一个类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> 

但当然语法wrong.How检查这不千的if-else?

回答

39

你的意思是这样

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

这应该返回真,只是如果同时obj1obj2是相同的特定类的。

但如果你用B extends A比较A这是不行的。如果你想返回真实的,即使一个是另一个你将不得不写一个更强大的比较功能亚型平等。我认为,你可以通过getSuperClass()循环上去层次树做。

我觉得一个简单的解决办法也可以做A.getClass().isAssignableFrom(B.getClass()),假设B extends A

+0

没有理由做'.equals()',类只在游泳池中存在一次。 – kba 2012-04-15 14:24:09

+5

必要性不是风格问题。 – Jack 2012-04-15 14:24:38

+0

这就是我正在寻找的。 – 2012-04-15 14:43:02

4

你可以做

if (obj1.getClass() == obj2.getClass()) { ... } 
-2

的instanceof需要向类,而不是另一个目标点。要检查两个对象都来自同一类型的对象做一些下面..

if((obj1 instanceof ClassName) && (obj2 instanceof ClassName)) { 
    do whatever 
} 
+0

这实际上是不正确的。你正在检查两个对象是否是其他类型的后代。问题是要找出两个对象是否相同,但是*任意*类型。 – Adowrath 2017-02-16 19:51:21

0

由于B,C和d是A的子类,并且要做到这些类的东西,我不会不要使用instanceOf运营商。这是唯一有用的,当没有其他方式。

你可以更好地覆盖超方式和/或变量,所以你可以使用所有的对象是相同的,艰难的,他们会做(打印出来的自己的类型例如)不同的东西。

1

事情是这样的:

if(classA.getClass().getName().equals(classB.getClass().getName())) 
    <do something> 
相关问题