2012-04-15 193 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> 
相關問題