导入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)具有相同的擦除,但不会覆盖它
我不知道上述错误背后的概念是什么,有人可以建议我在哪里可以学习这个概念?
这里工作的概念称为类型擦除。HashSet
定义方法add(T)
,然后定义方法add(Object)
。乍一看,可能会觉得不错。您的方法只是重载add
。但是,由于擦除T
is Object
,因此两者具有相同的已擦除签名。
现在,如果您的方法正确地覆盖了中的方法,那将很好HashSet
。但是要这样做,您应该使用add(Integer)
而不是add(Object)
。您没有适当地重写父方法,因此将其报告为冲突,因为类不能提供具有相同签名的两个方法。
您的Abc
示例遵循相同的推理。您声明的两个方法具有相同的擦除签名,因此会发生冲突。
Angelika Langer泛型常见问题解答
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句