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 を 2 つの異なる意味で使用しています。子の名前を 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でなければならないのですか、それはリストではありませんか。

編集:おそらく、特定のケースで必要なものと、一般的な定義として定義したいものを混同している可能性があります。例えば

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 を取得するように定義した子がいますが、すべての子が LinkedList を取得する必要があるわけではありません。

于 2010-12-16T21:44:38.520 に答える