Столкновение имен обобщенных элементов Java при расширении - PullRequest
2 голосов
/ 17 декабря 2010

Я новичок в дженериках и буду признателен за любую помощь в решении следующей проблемы:

У меня есть родительский класс:

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 Ответ

2 голосов
/ 17 декабря 2010

Вы используете V для двух разных значений.Переименование V в W у ребенка должно выглядеть следующим образом.Здесь V в родительском элементе это LinkedList

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...