Java generics, не может сделать конструктор с параметром любого объекта с итерацией

90
13

У меня есть следующая подпись класса: public class LoopIterator<E> implements Iterator<E>. У меня есть существующий конструктор: public LoopIterator(Iterable<E> iterable){. Я попытался ввести в свой основной класс/главную функцию следующее:

LinkedList<String> l= new LinkedList<String>();
l.add("1"); l.add("2"); l.add("3"); l.add("4");
LoopIterator<LinkedList<String>> m= new LoopIterator<LinkedList<String>>(l);

Но я не могу, потому что конструктор ожидает получить Iterable<E> который не соответствует LinkedList<String>.

Итак, как я могу изменить свою подпись конструктора/класса, чтобы я мог ввести конструктор в любой Iterable вида E?.

спросил(а) 2021-01-28T00:28:09+03:00 4 месяца, 3 недели назад
1
Решение
108

В этом случае LinkedList реализует Iterable, а E - тип возвращаемого объекта при повторении (например, String).

Итак, вам нужно...

LoopIterator<String> m = new LoopIterator<String>( l);

и компилятор должен быть более счастливым.

ответил(а) 2021-01-28T00:28:09+03:00 4 месяца, 3 недели назад
45

LoopIterator<LinkedList<String>> m= new LoopIterator<LinkedList<String>>(l);

С левой стороны вы определяете, что m.next() вернет экземпляры LinkedList<String> а одну из них вы передадите то, что перебирает экземпляры String. Так что противоречие!


Просто скажи, что хочешь! m.next() вернет экземпляры String:

LoopIterator<String> m = new LoopIterator<String>( l);

ответил(а) 2021-01-28T00:28:09+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема