Java 带有类<;的hashCode()和equals();T>;
我在Java 带有类<;的hashCode()和equals();T>;,java,class,equals,hashcode,Java,Class,Equals,Hashcode,我在equals()和hashcode()中遇到了一个意外问题 Eclipse拒绝正确生成它们,因为Class不会覆盖它们。哦,嗯 所以我不得不通过.getName()结果来比较它们,但这很难看 private Class<T> clientClass; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + clien
equals()
和hashcode()
中遇到了一个意外问题
Eclipse拒绝正确生成它们,因为Class
不会覆盖它们。哦,嗯
所以我不得不通过.getName()
结果来比较它们,但这很难看
private Class<T> clientClass;
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + clientClass.getName().hashCode();
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj) return true;
if (obj == null) return false;
if (!(obj instanceof MessageChannel)) return false;
MessageChannel<?, ?> other = (MessageChannel<?, ?>) obj;
if (!clientClass.getName().equals(other.clientClass.getName())) return false;
return true;
}
私有类clientClass;
@凌驾
公共int hashCode()
{
最终整数素数=31;
int结果=1;
result=prime*result+clientClass.getName().hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj)
{
如果(this==obj)返回true;
if(obj==null)返回false;
如果(!(obj instanceof MessageChannel))返回false;
MessageChannel other=(MessageChannel)obj;
如果(!clientClass.getName().equals(other.clientClass.getName())返回false;
返回true;
}
请注意,T是一个参数
如何正确地做到这一点?您不需要做一些特殊的事情来处理类的
equals
和hashcode
。当前行为(从对象继承而来)在语义上是正确的。(如果Eclipse向您发出警告,则忽略它。警告不正确。)
难道我不可能得到表示同一个类的两个不同的类实例吗?对象只在它们上使用==即可。也许有两个类加载器或者别的什么,我对这种反射魔法不太熟悉
是的,这是可能的
但在这种情况下,从Java类型系统的角度来看,它们实际上是不同的类。(有关详细信息,请参见JLS。)因此,您应该将它们视为不平等。您不需要做一些特殊的事情来处理类的等于和hashcode
。当前行为(从对象继承而来)在语义上是正确的。(如果Eclipse向您发出警告,则忽略它。警告不正确。)
难道我不可能得到表示同一个类的两个不同的类实例吗?对象只在它们上使用==即可。也许有两个类加载器或者别的什么,我对这种反射魔法不太熟悉
是的,这是可能的
但在这种情况下,从Java类型系统的角度来看,它们实际上是不同的类。(有关详细信息,请参见JLS。)因此,您应该将它们视为不平等。您不需要做一些特殊的事情来处理类的等于和hashcode
。当前行为(从对象继承而来)在语义上是正确的。(如果Eclipse向您发出警告,则忽略它。警告不正确。)
难道我不可能得到表示同一个类的两个不同的类实例吗?对象只在它们上使用==即可。也许有两个类加载器或者别的什么,我对这种反射魔法不太熟悉
是的,这是可能的
但在这种情况下,从Java类型系统的角度来看,它们实际上是不同的类。(有关详细信息,请参见JLS。)因此,您应该将它们视为不平等。您不需要做一些特殊的事情来处理类的等于和hashcode
。当前行为(从对象继承而来)在语义上是正确的。(如果Eclipse向您发出警告,则忽略它。警告不正确。)
难道我不可能得到表示同一个类的两个不同的类实例吗?对象只在它们上使用==即可。也许有两个类加载器或者别的什么,我对这种反射魔法不太熟悉
是的,这是可能的
但在这种情况下,从Java类型系统的角度来看,它们实际上是不同的类。(详情请参见JLS。)因此,您应该将它们视为不平等。我建议您执行以下操作
@Override
public boolean equals(Object that) {
return EqualsBuilder.reflectionEquals(that, this);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
你可以阅读更多关于这个漂亮的建设者
我建议您执行以下操作
@Override
public boolean equals(Object that) {
return EqualsBuilder.reflectionEquals(that, this);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
你可以阅读更多关于这个漂亮的建设者
我建议您执行以下操作
@Override
public boolean equals(Object that) {
return EqualsBuilder.reflectionEquals(that, this);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
你可以阅读更多关于这个漂亮的建设者
我建议您执行以下操作
@Override
public boolean equals(Object that) {
return EqualsBuilder.reflectionEquals(that, this);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
你可以阅读更多关于这个漂亮的建设者
你所说的“因为类不重写它们”到底是什么意思?ClassClass
不定义equals或hashcode,我认为这意味着什么很清楚。为什么不使用非重写的Class.equals/hashcode?Eclipse怎么说无关紧要,身份是Class
(例如,对于任何T
,都应该有一个Class
的实例。类不需要重写它们就可以调用它们,因为这些方法是在Object上定义的。是的,但我不可能得到两个表示同一类的不同类实例吗?Object只在它们上使用=
。)带有两个类加载器的rhaps或者其他什么,我对这种反射魔法不太熟悉。你说的“因为类不会覆盖它们”到底是什么意思classclass
不定义equals或hashcode,我认为这意味着什么很清楚。为什么不使用非重写的class.equals/hashcode呢?Eclipse怎么说都无所谓,identity是class
的一个合理比较(例如,对于任何T
,都应该有一个Class
的实例。类不需要重写它们就可以调用它们,因为这些方法是在Object上定义的。是的,但我不可能得到两个表示同一类的不同类实例吗?Object只在它们上使用=
。)带有两个类加载器的rhaps或者其他什么,我对这种反射魔法不太熟悉。你说的“因为类不会覆盖它们”到底是什么意思classclass
不定义equals或hashcode,我认为这意味着什么很清楚。为什么不使用非重写的class.equals/hashcode呢?不管Eclipse怎么说,identity是类的一个合理比较<