Java Iterable <Iterable <T>> в ArrayList <ArrayList <T>> - PullRequest
2 голосов
/ 17 февраля 2011

Может быть, я что-то упускаю, но я подумал, что если я объявлю свой класс таким:

public class Something<T> implements Iterable<Iterable<T>> {
  public Something(Iterable<Iterable<T>> input) {
  ...

Я должен быть в состоянии создать его таким образом:

ArrayList<ArrayList<String>> l = new ArrayList<ArrayList<String>>();

Something<String> s = Something<String>(l);

К сожалению, этодает мне ошибку.Я думал, что ArrayLists являются Iterable, поэтому они должны отображаться точно в моем определении конструктора.

Ответы [ 2 ]

7 голосов
/ 17 февраля 2011

Вам нужно изменить конструктор так, чтобы он принимал все, что расширяет Iterable<T>

public Something(Iterable<? extends Iterable<T>> list){}

Причина этого в том, что универсальные типы не могут буквально расширять другие универсальные типы. List<String> нельзя присвоить List<CharSequence>. Ключевое слово extends позволяет выполнять этот тип назначения.

1 голос
/ 17 февраля 2011

Субтипирование с помощью дженериков очень неинтуитивно.Для того, что вы хотите сделать, вам нужны подстановочные знаки, и это было бы довольно уродливо.

Здесь есть отличное объяснение в разделе 3 - http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

...