2010-12-16 120 views
2

当我新的仿制药,我希望得到任何帮助,我可以用下面的问题得到:Java泛型名称冲突扩展

我有这样的父类:

public class Parent<K, V> { 
    public void f(K key,V value){} 
} 

然后,我有这个子类:

public class Child<K,V> extends Parent<K,LinkedList<V>> { 
    @Override 
    public void f(K key,V value) {} 
} 

好了,我们希望在Child.f会覆盖Parent.f,但不幸的是编译器不喜欢什么是怎么回事和连锁行业上课我:

Name clash: The method f(K, V) of type Child<K,V> has the same erasure as f(K, V) of type Parent<K,V> but does not override it

我曾在不同的上下文中见过这个错误,但我不知道为什么在这个特殊的出现。有什么方法可以避免吗?

在此先感谢。

+0

为什么孩子延长'Parent >'而不是'Parent '? – DGH 2010-12-16 21:42:42

+0

因为Parent是一个HashMap的形式,而Child是一个MultiMap。但我需要覆盖某些方法来确保效率。只是实例化一个'HashMap >'不适合我的情况。 – delmet 2010-12-16 22:02:20

回答

2

您对V有两种不同的含义。将V重命名为W,应该看起来像这样。这里V在父是LinkedList的< W>

public class Child<K,W> extends Parent<K,LinkedList<W>> { 
    @Override 
    public void f(K key,LinkedList<W> value) {} 
} 

BTW:它是否真的要成为一个具体的LinkedList类,不能使它名单。

编辑:或许您在特定情况下需要将您需要的东西与您想要定义为通用定义的东西混淆。例如

public class Child<K,V> extends Parent<K,V> { 
    @Override 
    public void f(K key, V value) {} 
} 

Child<String, LinkedList<String>> child = new Child<String, LinkedList<String>>(); 
child.f("key", new LinkedList<String>()); 

在这里你有一个你已经定义为接受LinkedList但不是所有Child'ren都必须接受LinkedList的孩子。

+0

问题是我不想将一个LinkedList传递给f,我想传递一个对象,我可能会将它放入列表中。至少这是我的意图。我使它成为一个LinkedList,因为它可以在我的应用程序中执行,我可能需要创建新的。 – delmet 2010-12-16 21:56:25

+0

然后它不能是一个覆盖。它必须是两种不同的方法。对于任何K和V,父母的任何孩子都必须接受V作为f的第二个参数。 – Dan 2010-12-16 22:03:45

+0

我明白了。谢谢你的帮助。尽管如此,这会消除多态性,所以我将不得不寻找更优雅的解决方案。 – delmet 2010-12-16 22:07:18