如果需要使用Class<T>
作为Map
的键的一部分,定义hashCode
和equals
的正确方法是什么Class<T>
继承了Object
中的那些,它们检查引用相等性并返回内存地址作为哈希码,但在我看来,equals
的有意义定义和Class<T>
的hashCode
定义是什么还不清楚
例如,我应该使用theClass.getClass().hashCode();
(我们有Class<T> theClass;
)来使用实际实例的方法吗
但这似乎不是正确的做法。
例如,在Class<T>
:的javadoc中
每个数组也属于一个反映为类的类由具有相同元素类型和尺寸数量
所以在某些情况下,对象之间似乎共享了相同的Class<T>
?那么接下来该怎么办呢?也许使用theClass.hashCode()
和theClass.equals()
来使用引用相等?这里一点也不确定。
从java.lang.Object
继承的hashCode
和equals
java.lang.Class
的实现是有意义的,并且通常是适当的,因为类的所有实例都保证从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()
返回类的唯一字符串表示。如果程序不使用多个类加载器,则可以将equals/hashCode的此字符串用作普通字符串。