导入 java.util.*;
class A extends HashSet<Integer> {
public boolean add(Object obj){ //compiler error
return true;
}
}
or
class Abc <T> {
public void add(T t){} //compiler error
public void add(Object i){} //compiler error (can't overload?)
}
错误:名称冲突:test2 类型的方法 add(Object) 与 HashSet 类型的 add(E) 具有相同的删除,但没有覆盖它
我不知道上述错误背后的概念是什么,有人可以建议我在哪里可以研究这个概念吗?
最佳答案
这里工作的概念叫做type erasure . HashSet
定义了一个方法add(T)
,你定义了一个方法add(Object)
。乍一看,可能会认为这没问题;您的方法只是重载了 add
。但是,T
的删除是Object
,因此两者具有相同的删除签名。
现在,如果您的方法正确地覆盖了 HashSet
中的方法,那就没问题了。但要这样做,您应该使用 add(Integer)
而不是 add(Object)
。您没有正确覆盖父方法,而是将其报告为冲突,因为一个类不能提供两个具有相同签名的方法。
您的 Abc
示例遵循相同的推理。您声明的两个方法具有相同的删除签名,因此它们会发生冲突。
延伸阅读
Angelika Langer 泛型常见问题解答
关于java - 名称冲突 : The method add(Object) of type test2 has the same erasure as add(E) of type HashSet<E> but does not override it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8768028/