2011-09-02 56 views
1

这是一个非常不完善的标题...我可以手动覆盖继承的方法吗?

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>) '重写它与之相冲突的继承方法(如果两者都在同一个类中定义,我可以看到它,但问题是:“当方法与继承方法具有相同的擦除时,我们覆盖继承的方法。一个有相同的擦除,所以它不会工作“)。

有没有办法强制编译器用DynamicList.addAll(int, Collection<E>)覆盖AbstractList.addAll(int, Collection<? extends E>)

+4

这是我所能理解它(这些规则相当神秘),抱怨是你的函数定义有效地阻止了对原始函数的访问,但它不会接受(编译时没有类型冲突)所有对原文的合法调用。 –

回答

1

你需要给出确切相同的签名方法来覆盖:

public boolean addAll(int index, Collection<? extends E> what) 

有没有办法强迫编译器覆盖AbstractList.addAll(int, Collection<? extends E>)DynamicList.addAll(int, Collection<E>)

如果您正在考虑超载:否。由于删除,无法区分这两种方法。所以只能有一个。

如果你正在考虑重写:那么,如果你指定了不同的签名,这不会是压倒性的,是不是?你不能在签名中将Collection缩小到ArrayList,对吧?

1

具体来说,原来addAll(int, Collection<? extends E>)指出,第二PARM可以是可扩展Ë项目的任何集合,而你的addAll(int, Collection<E>)版本需要的物品为E准确,他们不能延长E.