扩展时Java泛型名称冲突

时间:2010-12-16 21:37:29

标签: java generics override name-clash

我是仿制药的新手,如果我能解决以下问题,我将不胜感激:

我有这个父类:

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

我之前在不同的背景下看到过这个错误,但我不确定为什么会出现这个错误。有没有办法避免它?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您使用V代表两种不同的含义。在孩子中将V重命名为W应该如下所示。这里父亲中的V是LinkedList&lt; W&gt;

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

顺便说一句:它真的必须是一个具体的类LinkedList,不能是List。

编辑:也许您在特定情况下需要将您想要定义为通用定义的内容混淆。 e.g。

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都必须使用LinkedLists。