import 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?)
}
Run Code Online (Sandbox Code Playgroud)
错误:名称冲突:类型为test2的方法add(Object)与类型为HashSet的add(E)具有相同的擦除但不覆盖它
我不知道上面背后的概念是什么错误可以任何人建议我可以在哪里研究这个概念?
这里的概念称为类型擦除. HashSet定义方法add(T),并定义方法add(Object).人们可能会认为这是可以的; 你的方法只是重载add.但是,删除的T是Object两个具有相同的擦除签名.
现在,如果您的方法正确地覆盖了方法,那就没问题了HashSet.但要这样做,你应该使用add(Integer)而不是add(Object).您没有正确覆盖父方法,因此它被报告为冲突,因为类不能提供具有相同签名的两个方法.
您的Abc示例遵循相同的推理.您声明的两个方法具有相同的擦除签名,因此它们会发生冲突.
Angelika Langer Generics FAQ