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

Cra*_*lus 8 java hash equals hashmap hashcode

如果需要使用a Class<T>作为键的一部分Map来定义hashCode和的正确方法是什么equals
A Class<T>继承Object检查引用相等性并将内存地址作为哈希码返回的那些,但在我看来,不清楚a的有意义的定义equalshashCode定义是什么Class<T>.
我应该使用theClass.getClass().hashCode();例如(我们有Class<T> theClass;)使用实际实例的方法吗?
但这似乎不是正确的做法.
例如在javadocClass<T>:

每个数组也属于一个类,它反映为一个Class对象,由具有相同元素类型和维数的所有数组共享

所以在某些情况下似乎在Class<T>对象之间共享?那么接下来的方法是什么?也许使用theClass.hashCode()theClass.equals()使用引用相等?这里根本不确定.

mer*_*ike 9

实现hashCodeequals java.lang.Class继承java.lang.Object是有意义的并且通常是合适的,因为类的所有实例都保证从中返回相同的 Class对象getClass(),即

new Integer(2).getClass() == new Integer(3).getClass();
Run Code Online (Sandbox Code Playgroud)

这有点埋没在文档中; getClass()javadoc写道:

返回:

Class对象,表示此对象的运行时类.

也可以看看:

文字,Java™语言规范的第15.8.2节.

该部分写道:

类文字求值为由当前实例的类的定义类加载器(第12.2节)定义的命名类型(或void)的Class对象.

第12.2节写道:

性能良好的类加载器维护这些属性:

  • 给定相同的名称,一个好的类加载器应该总是返回相同的类对象.
  • ...

恶意类加载器可能违反这些属性.但是,它不能破坏类型系统的安全性,因为Java虚拟机可以防范这种情况.

是的,如果相同的类定义由不同的类加载器加载,则类对象将不相等.由于运行时将这些类视为独立类(只是碰巧共享相同的名称,但不一定相似,更不用说二进制兼容),这通常是需要的.