Вопрос дженериков Java - PullRequest
2 голосов
/ 10 июня 2010

Итак, у меня есть 3 класса.

Abstract class A 

Class B extends class A

independent Class C

В классе D, который содержит метод main, я создаю список экземпляров класса B

List<B> b =  methodCall(); // the method returns a list of instances of class B

Теперь в классе C у меня есть один метод, который является общим для A и B, и, следовательно, я не хочу его дублировать. Я хочу иметь один метод, который принимает в качестве входных данных экземпляр класса A, следующим образом:

public void someMethod(List<A> a)

Однако, когда я делаю:

C c = new C();
c.someMethod(b);

Я получаю сообщение об ошибке, что некоторый метод не применим для аргумента List<B>, вместо этого он ожидает получить List<A>.

Есть ли хороший способ исправить эту проблему? Большое спасибо!

Ответы [ 3 ]

8 голосов
/ 10 июня 2010

Если у вас есть метод, который ожидает List<A>, и класс B extends A, и вы хотите передать этот метод List<B>, то вы должны объявить метод как:

public void someMethod(List<? extends A> list)

Это позволяет списку, переданному методу, быть списком A или чем-то, что расширяет B.

Обратите внимание, что вы не сможете сказать точный тип ?, переданный в метод.

Кроме того, если у вас есть дублированные методы между двумя классами, это, вероятно, признак того, что что-то не так с вашим дизайном.

3 голосов
/ 10 июня 2010
public void someMethod(List<? extends A> a){ //...
1 голос
/ 10 июня 2010

В сигнатуре вашего метода есть List<A> a, что означает, что он принимает только список объектов типа A. Вам нужно что-то, что принимает список A и any subtype of A (или семейство подтипов A).

Что вам нужно, это:

public void someMethod(List<? extends A> list) {
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...