【问题标题】:equals method in java generic classjava泛型类中的equals方法
【发布时间】:2015-05-14 23:36:14
【问题描述】:

我有一个名为 ArrayBag 的通用类。我想覆盖equals方法。所以我写了

public boolean equals(T other){

} // gives error

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

【问题讨论】:

  • 最好也使用@Override 注解。
  • 你应该总是写“equals(Object)”,即使你没有使用泛型。

标签: java equals


【解决方案1】:

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

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

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

【讨论】:

  • 这对伙伴有很大帮助.. 另外你能解释一下 instanceOf 的作用吗??
  • instanceof 将检查other 对象是否属于T 类型。这可以防止在投射对象时出现可能的异常。如果不是T 类型,equals 方法应该返回 false。
  • 使用 instanceof 时泛型类出现错误。链接描述了详细信息:stackoverflow.com/questions/5734720/…。总之,java泛型类中不允许使用关键字“instanceof”。
【解决方案2】:

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

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

【讨论】:

  • 在不先检查对象是否作为 T 实例的情况下进行转换时要小心。您最终可能会遇到 ClassCastException。
【解决方案3】:

你需要这个。

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

}

【讨论】:

    【解决方案4】:

    任何时候你需要重写一个方法,签名必须与要重写的方法相同。因此,您必须将 Object 作为唯一且唯一的参数传递给您的 equals 方法,才能使其按需要运行。

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

    看起来像:

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

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      相关资源
      最近更新 更多