2

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

我有这个父类:

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

我以前在不同的上下文中看到过这个错误,但我不确定它为什么会出现在这个特定的上下文中。有什么办法可以避免吗?

提前致谢。

4

1 回答 1

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

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

编辑:也许您将在特定情况下所需的内容与您想要定义为通用定义的内容相混淆。例如

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。

于 2010-12-16T21:44:38.520 回答