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

时间:2012-09-16 12:34:57

标签: java hash hashmap equals hashcode

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

  

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

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

2 个答案:

答案 0 :(得分:9)

hashCode继承的equalsjava.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。