这是一个非常不完美的标题......
public class A extends AbstractList
{
public boolean addAll(int index, Collection<E> what){}
}
但是Eclipse给了我编译错误
Name clash: The method addAll(int, Collection<E>) of type DynamicArray<E> has the same
erasure as addAll(int, Collection<? extends E>) of type AbstractList<E> but does not
override it
我理解擦除的问题是什么,但是我不明白为什么addAll(int, Collection<E>)
不会覆盖与它发生冲突的继承方法(如果两者都在我可以看到的同一个类中定义,但问题是:“当一个方法与继承方法具有相同的擦除时,我们会覆盖继承的方法。但是这个方法具有相同的擦除,因此它不起作用”。
有没有办法强制编译器用AbstractList.addAll(int, Collection<? extends E>)
覆盖DynamicList.addAll(int, Collection<E>)
?
答案 0 :(得分:1)
您需要提供与要覆盖的方法完全相同的签名:
public boolean addAll(int index, Collection<? extends E> what)
有没有办法强制编译器用
AbstractList.addAll(int, Collection<? extends E>)
覆盖DynamicList.addAll(int, Collection<E>)
?
如果您正在考虑重载:否。由于擦除,无法区分这两种方法。所以只能有一个。
如果您正在考虑覆盖:嗯,如果您指定了不同的签名,那将不会覆盖,是吗?你不能在签名中缩小Collection到ArrayList,对吧?
答案 1 :(得分:1)
具体来说,原始addAll(int, Collection<? extends E>)
表示第二个parm可以是可以扩展E的任何项目集合,而您的版本addAll(int, Collection<E>)
要求项目完全是E,并且它们不能扩展E.