我有一个名为ArrayBag的泛型类。我想重写equals方法。所以我写了
public boolean equals(T other){
} // gives error
错误消息:名称冲突:类型为ArrayBag的方法等于(T)与Object类型的equals(Object)具有相同的擦除但不 覆盖它
答案 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;
}