如果需要使用Class<T>
作为Map
密钥的一部分,那么定义hashCode
和equals
的正确方法是什么?
Class<T>
继承Object
中检查引用相等性的那些并返回内存地址作为哈希码,但在我看来,不清楚equals
和{{的有意义的定义是什么1}} hashCode
的定义
我应该使用Class<T>
例如(我们有theClass.getClass().hashCode();
)来使用实际实例的方法吗?
但这似乎不是正确的做法
例如Class<T> theClass;
中的Class<T>
:
每个数组也属于一个反映为Class的类 由具有相同元素类型的所有数组共享的对象 维数
所以在某些情况下似乎在对象之间共享相同的Class<T>
?那么接下来的方法是什么?也许使用theClass.hashCode()
和theClass.equals()
来使用引用相等性?这里根本不确定。
答案 0 :(得分:9)
从hashCode
继承的equals
和java.lang.Class
java.lang.Object
的实现是有意义且通常是合适的,因为类的所有实例都保证返回相同来自Class
的 getClass()
对象,即
new Integer(2).getClass() == new Integer(3).getClass();
这有点埋没在文档中; javadoc of getClass()写道:
返回:
表示此对象的运行时类的Class对象。
另见:
Literals,Java™语言规范的第15.8.2节。
That section写道:
类文字计算指定类型(或void)的Class对象,该类对象由当前实例的类的定义类加载器(第12.2节)定义。
和section 12.2写道:
表现良好的类加载器维护这些属性:
- 给定相同的名称,一个好的类加载器应该总是返回相同的类对象。
- ...
恶意类加载器可能违反这些属性。但是,它不能破坏类型系统的安全性,因为Java虚拟机可以防范这种情况。
是的,如果不同的类加载器加载了相同的类定义,则类对象将不相等。由于运行时将这些类视为独立类(只是碰巧共享相同的名称,但不一定相似,更不用说二进制兼容),通常需要这样做。
答案 1 :(得分:0)
方法String getName()
返回Class的唯一字符串表示形式。如果您的程序不使用多个类加载器,则可以将此String用于equals / hashCode作为普通String。