等于java泛型类中的方法

时间:2011-11-24 14:13:08

标签: java equals

我有一个名为ArrayBag的泛型类。我想重写equals方法。所以我写了

public boolean equals(T other){

} // gives error
  
    

错误消息:名称冲突:类型为ArrayBag的方法等于(T)与Object类型的equals(Object)具有相同的擦除但不      覆盖它

  

4 个答案:

答案 0 :(得分:6)

您尝试覆盖的equals方法需要Object。当您的代码转换为字节代码时,键入erasure会将您的T转换为Object,这与现有的equals方法冲突。

@Override
public boolean equals(Object other) {
    if (other instanceof T)
    {
        T o = (T) other;
        ...
    }
}

在方法内部,您可以处理转换为T

答案 1 :(得分:2)

equals(T other)替换为equals(Object other),然后将other转换为方法实现中的T

public boolean equals(Object other)
{
    T t = (T) other;
    // ...
}

答案 2 :(得分:0)

你需要这个。

public boolean equals(Object other){
      T t = (T) other;

}

答案 3 :(得分:0)

每当您需要覆盖方法时,签名必须与要覆盖的方法相同。因此,您必须将Object作为equals方法的唯一参数传递,以使其按需运行。

作为Grantham的可靠解决方案的替代方案,您可以使用getClass()代替instanceof,例如,如果您计划扩展您的泛型类并且不希望子类实例等于您的超类实例。

这看起来像是:

@Override
public boolean equals(Object other) {
    if (other != null && getClass() == other.getClass()) {
        T o = (T) other;

        // ...

    }
    return false;
}