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



如果需要使用Class<T>作为Map的键的一部分,定义hashCodeequals的正确方法是什么
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继承的hashCodeequalsjava.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的此字符串用作普通字符串。

相关内容

最新更新