Как управлять коллекцией для типа, который расширяет другой? - PullRequest
0 голосов
/ 27 июня 2018


У меня следующая ситуация:

public class A {...};
public class B extends A {...};

И я определил функцию внутри class C со следующим заголовком:

private void handleABC(final Collection<A>) {...}

но я получаю следующее сообщение, когда пытаюсь вызвать его, передавая тип B:

Метод handleABC (Collection) в типе C не применим для аргументов (Collection).

Разве это не должно работать для A и B, так как я определил, что метод Collection<A> и B простирается от A? Что я делаю не так?

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Пожалуйста, просмотрите этот ответ: https://stackoverflow.com/a/897973/3465242

<T extends SomeClass>

когда фактическим параметром может быть SomeClass или любой его подтип.

В вашем случае

private void handleABC (final Collection<? extends A> )
0 голосов
/ 27 июня 2018

изменить подпись handleABC() на

private void handleABC (final Collection<? extends A> )

так, что методы принимают коллекцию подклассов A.

0 голосов
/ 27 июня 2018

Вы должны передать класс, указанный в операторе diamond, а не конкретные классы, или вы можете использовать «? Extends A». Вы можете прочитать эту ссылку: https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

0 голосов
/ 27 июня 2018

B extends A, да, но Collection<B> extends Collection<A> не так.

Как кто-то упоминал в комментарии, попробуйте Collection<? extends A>.

...