我可以手动覆盖继承的方法吗?

时间:2011-09-02 01:12:32

标签: java generics signature overwrite

这是一个非常不完美的标题......

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>)

2 个答案:

答案 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.