簡體   English   中英

如何有意義地為java.lang.Class定義hashCode和equals <T> ?

[英]How to meaningfully define hashCode and equals for a java.lang.Class<T>?

如果需要使用Class<T>作為Map鍵的一部分,那么定義hashCodeequals的正確方法是什么?
Class<T>繼承Object中的那些,它檢查引用相等性並返回內存地址作為哈希碼,但在我看來,不清楚equals的有意義定義和Class<T> hashCode定義。
我應該使用theClass.getClass().hashCode(); 例如(我們有Class<T> theClass; )使用實際實例的方法?
但這似乎不是正確的做法。
例如,在Class<T>javadoc中:

每個數組也屬於一個類,它反映為一個Class對象,由具有相同元素類型和維數的所有數組共享

所以在某些情況下似乎在對象之間共享相同的Class<T> 那么接下來的方法是什么? 也許使用theClass.hashCode()theClass.equals()來使用引用相等? 這里根本不確定。

hashCodeequals java.lang.Class的實現繼承自java.lang.Object是有意義的並且通常是合適的,因為類的所有實例都保證從getClass()返回相同的 Class對象,即

new Integer(2).getClass() == new Integer(3).getClass();

這有點埋沒在文檔中; getClass()javadoc寫道:

返回:

Class對象,表示此對象的運行時類。

也可以看看:

文字,Java™語言規范的第15.8.2節。

該部分寫道:

類文字求值為由當前實例的類的定義類加載器(第12.2節)定義的命名類型(或void)的Class對象。

第12.2節寫道:

性能良好的類加載器維護這些屬性:

  • 給定相同的名稱,一個好的類加載器應該總是返回相同的類對象。
  • ...

惡意類加載器可能違反這些屬性。 但是,它不能破壞類型系統的安全性,因為Java虛擬機可以防范這種情況。

是的,如果相同的類定義由不同的類加載器加載,則類對象將不相等。 由於運行時將這些類視為獨立類(只是碰巧共享相同的名稱,但不一定相似,更不用說二進制兼容),這通常是需要的。

String getName()方法返回Class的唯一 String表示形式。 如果您的程序不使用多個類加載器,則可以將此String用於equals / hashCode作為普通String。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM