gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:27 25 4
gpt4 key购买 nike

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

Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions

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

最佳答案

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

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

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

Returns:

The Class object that represents the runtime class of this object.

See Also:

Literals, section 15.8.2 of The Java™ Language Specification.

That section写道:

A class literal evaluates to the Class object for the named type (or for void) as defined by the defining class loader (§12.2) of the class of the current instance.

section 12.2写道:

Well-behaved class loaders maintain these properties:

  • Given the same name, a good class loader should always return the same class object.
  • ...

A malicious class loader could violate these properties. However, it could not undermine the security of the type system, because the Java virtual machine guards against this.

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

关于java - 如何有意义地为 java.lang.Class<T> 定义 hashCode 和 equals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com