В следующем коде:Реализация Iterable путем возврата итератора над подтипом
public class Bar { ... }
public class Foo extends Bar { ... }
public class BarIterable implements Iterable<Bar> {
List<Foo> foos = ...
@Override
public Iterator<Bar> iterator() {
return foos.iterator(); // Error: Type mismatch ...
}
}
Я получаю сообщение об ошибке в указанном месте, поскольку foos.iterator()
возвращает Iterable<Foo>
, а не Iterable<Bar>
. К сожалению, простой бросок не будет работать:
return (Iterator<Bar>) foos.iterator(); // Error: Cannot cast ...
Java также не позволяет мне изменить определение BarIterable
к
public class BarIterable implements Iterable<? extends Bar> { ... // Error: A supertype may not specify any wildcard
Что такое хороший способ решить эту проблему, которая делает не включают реализацию Iterable<Foo>
(реализация Iterable происходит из другого интерфейса, который не знает о Foo)?
Должен ли я написать себе оболочку Iterator класса, которая «распаковывает» каждое значение?
Я не уверен, но похоже, что вы реализуете наследование и эта строка 'общественного класса BarIterable реализует Iterable' вместо этого следует 'общественного класса BarIterable расширяет Iterable ', если я не ошибаюсь. –
@AlvinBunk 'Iterable' - это интерфейс, поэтому мне определенно нужно использовать' tools ', а не 'extends'. –
Как вы получаете 'foos'? –