Невозможно преобразовать java .util.List в java .lang.Iterable интерфейса шаблона - PullRequest
0 голосов
/ 06 августа 2020

У меня проблема с использованием списка объектов, реализующих интерфейс как итерацию этого интерфейса.

Мои определения классов выглядят следующим образом:

class BaseObject implements AInterface<OtherObject> {...}

class Foo extends BaseObject{...}

interface BInterface{
void doSomething(AInterface<OtherObject> a);
void doSomethingToIterable(Iterable<AInterface<OtherObject>> a);
}

Код, который выиграл 't compile is

private BInterface bInterface;
...

public void baa(List<Foo> list){
   bInterface.doSomethingToIterable(list);//This is the line that gives a compilation error
   ...
}

Ошибка компиляции, которую я получаю от maven:

incompatible types: java.util.List<my.package.Foo> cannot be converted to java.lang.Iterable<my.other.package.AInterface<my.third.package.OtherObject>>

Я могу вызвать doSomething для каждого элемента в списке. Фактически, я могу сделать это, встраивая реализацию doSomethingToIterable.

Запуск java -version в терминале дает результат

openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252_b09)
OpenJDK 64-Bit Server VM (build 1.8.0_252_b09)

Насколько я понимаю, поскольку List extends Collection, который расширяет Iterable, и Foo расширяет BaseObject, который реализует AInterface, эти два типа должны быть совместимы. Кажется, я неправильно понимаю.

Почему я получаю указанную выше ошибку и как ее исправить?

1 Ответ

2 голосов
/ 06 августа 2020

List<Subclass> не является экземпляром List<Superclass>.

Попробуйте:

void doSomethingToIterable(Iterable<? extends AInterface<OtherObject>> a)
...