2016-01-24 70 views
0

为什么java不会允许这种超越? 有什么,我失踪?使用集合时超越的规则

class Abc 
{ 
    public void add (List<String> li) 
    { 

    } 

} 
public class Test extends Abc { 
    public static void main(String args[]) 
    { 

    } 

    @Override 
    public void add (List<Object> li) 
    { 

    } 

虽然它允许方法重写,如果我删除

<Object> 

,只是写这实际上是一样的

List<Object> 

另外,在骑行方法列表L要添加,如果列表中的重叠方法和重叠方法具有相同的类型,则允许重载。

List<String> - over-ridden method 
List<String> - over-riding method 
+0

因为列表不是列表。而且因为使用原始类型告诉编译器:就像泛型类型不存在一样。 http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p,http://stackoverflow.com/questions/2770321/what-是原始类型和为什么应该我们使用它 –

+0

你正在重写使用泛型。 –

+0

@JBNizet:你能详细阐述一下:“使用原始类型告诉编译器:就像泛型类型不存在一样。” – Genius

回答

1

这是Generics在Java中设计的一个限制(设计缺陷?bug?)。

您的期望是合理的,但他们决定实施(和定义)泛型的方式使其不可行。

但是,如果你仔细想想,他们的设计可能比你的预期更合理的:在实际应用中,一个List<String>可能不能直接转换为List<Object> - 这是有可能创造一个全新的List,在复制内容。