[英]Unchecked cast: 'java.lang.Class<capture<?>>' to 'java.lang.Class<T>
[英]How to meaningfully define hashCode and equals for a java.lang.Class<T>?
如果需要使用Class<T>
作為Map
鍵的一部分,那么定義hashCode
和equals
的正確方法是什么?
Class<T>
繼承Object
中的那些,它檢查引用相等性並返回內存地址作為哈希碼,但在我看來,不清楚equals
的有意義定義和Class<T>
hashCode
定義。
我應該使用theClass.getClass().hashCode();
例如(我們有Class<T> theClass;
)使用實際實例的方法?
但這似乎不是正確的做法。
例如,在Class<T>
的javadoc中:
每個數組也屬於一個類,它反映為一個Class對象,由具有相同元素類型和維數的所有數組共享
所以在某些情況下似乎在對象之間共享相同的Class<T>
? 那么接下來的方法是什么? 也許使用theClass.hashCode()
和theClass.equals()
來使用引用相等? 這里根本不確定。
hashCode
和equals
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.