8

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

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

因此,在某些情况下Class<T>,对象之间似乎共享相同的内容?那么遵循的方法是什么?也许使用theClass.hashCode()theClass.equals()使用引用相等?这里完全不确定。

4

2 回答 2

9

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

new Integer(2).getClass() == new Integer(3).getClass();

这有点隐藏在文档中;getClass()的javadoc写道:

回报:

表示此对象的运行时类的 Class 对象。

也可以看看:

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

该部分写道:

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

12.2 节写道:

行为良好的类加载器维护以下属性:

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

恶意类加载器可能会违反这些属性。但是,它不会破坏类型系统的安全性,因为 Java 虚拟机对此进行了防范。

是的,如果相同的类定义被不同的类加载器加载,类对象将不相等。由于运行时将它们视为独立的类(它们恰好共享相同的名称,但不需要相似,更不用说二进制兼容了),这通常是需要的。

于 2012-09-16T13:15:28.160 回答
0

该方法String getName()返回类的唯一字符串表示。如果您的程序不使用多个类加载器,则可以将此字符串用于 equals/hashCode 作为普通字符串。

于 2012-09-16T12:59:54.507 回答