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);
}
你可以阅读更多关于这个漂亮的建设者

你所说的“因为类不重写它们”到底是什么意思?Class
Class
不定义equals或hashcode,我认为这意味着什么很清楚。为什么不使用非重写的Class.equals/hashcode?Eclipse怎么说无关紧要,身份是
Class
(例如,对于任何
T
,都应该有一个
Class
的实例。类不需要重写它们就可以调用它们,因为这些方法是在Object上定义的。是的,但我不可能得到两个表示同一类的不同类实例吗?Object只在它们上使用
=
。)带有两个类加载器的rhaps或者其他什么,我对这种反射魔法不太熟悉。你说的“因为类不会覆盖它们”到底是什么意思class
class
不定义equals或hashcode,我认为这意味着什么很清楚。为什么不使用非重写的class.equals/hashcode呢?Eclipse怎么说都无所谓,identity是
class
的一个合理比较(例如,对于任何
T
,都应该有一个
Class
的实例。类不需要重写它们就可以调用它们,因为这些方法是在Object上定义的。是的,但我不可能得到两个表示同一类的不同类实例吗?Object只在它们上使用
=
。)带有两个类加载器的rhaps或者其他什么,我对这种反射魔法不太熟悉。你说的“因为类不会覆盖它们”到底是什么意思class
class
不定义equals或hashcode,我认为这意味着什么很清楚。为什么不使用非重写的class.equals/hashcode呢?不管Eclipse怎么说,identity是
类的一个合理比较<