2012-07-25 43 views

回答

12

沒有陷阱真的;它的行爲就像你期望的那樣,如果你期望實際的行爲:)另外,Class對象的equals()方法只是從Object繼承的方法,無論如何它都使用==運算符。

唯一令人驚訝的部分是,如果同一個類文件由兩個不同的類加載器加載,則會得到兩個單獨的類對象,它們將被比較爲false。這是設計。

+0

但是,當然,這是完全正確的,如果有涉及到兩個類加載器返回'FALSE'。 – 2012-07-25 10:33:57

+1

這就是「這是設計」的含義。 – 2012-07-25 10:34:55

1

有沒有陷阱。 Class不會覆蓋默認Object.equals所以它是相同的語義,但實際上是使用equals是一個陷阱,因爲左操作數是null將挑起一個NPE。

+0

而這個陷阱是... – OrangeDog 2012-07-25 10:33:51

+0

@OrangeDog ......它在答案中說了什麼。 – 2012-07-25 10:34:39

+0

@OrangeDog他提到了陷阱,雖然不是一個很大的陷阱,但與使用'=='比較時仍然不方便。所以這是一個小陷阱。 – 2012-07-25 10:34:41

3

如果這些類由不同的ClassLoader加載,那麼這些類可能來自同一個文件,但不能由同一個對象表示。在這種情況下,它們也可能有不同的行爲,因爲其中一個加載器可能已經執行了字節碼修改。

0

類不重寫equals並直接擴展Object,在這種情況下,equals和==是相同的。

無論如何,最好的做法是使用等於你可以。

如果您不知道==和equals之間的差異,請閱讀它。

-1

這可能是明智的做

boolean compareTypes(Class<?> clazz, Class<?> rootClazz) { 
    return clazz.getName().equals(rootClazz.getName()); 
} 

或某些版本的getName()getSimpleName()

+1

'getSimpleName'將在不同包中的同名命名類中斷。 – 2014-08-27 15:07:51