Java 如何比较类型的实例是否相等
鉴于以下两个实例: 如何检查它们是否相等 我正在调用Java 如何比较类型的实例是否相等,java,reflection,Java,Reflection,鉴于以下两个实例: 如何检查它们是否相等 我正在调用toString并比较它们的值,例如: if (type1.toString().equals(type2.toString())) { .... } 我用多个嵌套的参数化类型对它进行了测试,到目前为止,它似乎是一致的。但是我想知道是否有一种正式的方法可以做到这一点。所有由Java运行时生成的Type实例都有正确的equals()和hashCode()实现,因此您可以也应该使用equals()来比较它们 例如,Parameterize
toString
并比较它们的值,例如:
if (type1.toString().equals(type2.toString())) {
....
}
我用多个嵌套的参数化类型对它进行了测试,到目前为止,它似乎是一致的。但是我想知道是否有一种正式的方法可以做到这一点。所有由Java运行时生成的
Type
实例都有正确的equals()和hashCode()实现,因此您可以也应该使用equals()来比较它们
例如,ParameterizedType
的Javadoc包含以下内容:
实现此接口的类的实例必须实现equals()方法,该方法使共享相同泛型类型声明且具有相同类型参数的任意两个实例相等
Class
对象从Object
继承其equals()和hashCode()实现,但这是正确的,因为Class
对象具有引用相等性
与将类型转换为字符串相比,Normal equals()的速度应该更快,内存效率也更高。除非在为
Type
创建的任何类中显式定义了toString()
方法,否则每次都会出错,除非它们是相同的对象。如果您只是尝试将a.equals(b)
用于类型a;b型代码>:equals()
仅比较两个对象的地址值。如果要检查两个不同分配的对象是否包含相同的对应成员变量,则必须在该类中定义equals()
方法。为什么不使用equals(),就像对任何其他对象一样?Type
不定义equals
的规则。除非您知道底层的实现,否则不要依赖它。我在尝试创建自己的parameteredType
实现时也遇到了这个问题。问题是:您不知道如何实现hashCode
!但我想这是一个更普遍的问题。我已经使用equals运行了所有测试,它们都通过了,就像使用toString一样。所以我想这是正确的答案。这在什么地方有保证吗?在javadoc中,我看到了对ParameterizedType和TypeVariable的这种保证,而不是GenericarArrayType和WildcardType。Guava库肯定依赖于com.google.common.reflect
下的一系列内容的这种行为,而com.google.common.reflect使用得相当广泛。这是半无文档的(并且,但不是以与这个问题相关的方式),但通常足够稳定,可以依赖于大型生产代码库。我认为这与 Sun.Mist.UnabySt/API >是阿德的事实API。对于大多数类型的实例(例如类),身份语义实际上是正确的。参数化类型和类型通配符等异常需要正确的equals实现。除非你正在做一些非常奇怪的事情,否则没有人会编写自己的类型实现。
if (type1.toString().equals(type2.toString())) {
....
}