Список списка общего типа в Java возможен?

У меня есть следующий общий тип:

public class Library<T> {}

Мне нужно поместить каждый универсальный тип в список, например:

ArrayList<Library<Photo>> listPhotoLibrary
    = new ArrayList<Library<Photo>>();
ArrayList<Library<Video>> listVideoLibrary
    = new ArrayList<Library<Video>>();

Затем мне нужно поместить этот список в общий список. Сначала я попробовал это:

ArrayList<Library<?>> listTopLibrary = new ArrayList<Library<?>>();

Приведенный выше код позволил мне добавить все библиотеки в плоский список. Однако это не то, чего я хочу. Я хочу, чтобы список типизированных библиотек был в другом списке. Например, индекс 0 — это список библиотек видео, индекс 1 — список библиотек фотографий и так далее. Я попытался сделать это ниже:

ArrayList<ArrayList<Library<?>>> listTopLibrary
    = new ArrayList<ArrayList<Library<?>>>();

Это не работает. Когда я пытаюсь добавить в список, он говорит мне:

The method add(ArrayList<Library<?>>) in the type ArrayList<ArrayList<Library<?>>>
is not applicable for the arguments (ArrayList<Library<Photo>>)

Любая идея, почему компилятор жалуется? И если есть способ обойти это?


person user3804927    schedule 20.11.2014    source источник


Ответы (3)


Это ошибка компиляции, потому что ArrayList<Library<?>> не является супертипом ArrayList<Library<Photo>. Вы можете объявить массив следующим образом:

ArrayList<ArrayList<? extends Library<?>>> listTopLibrary = new ArrayList<>();

Подробное объяснение, почему можно найти в вложенный универсальный тип Java

person mkobit    schedule 20.11.2014
comment
Спасибо, это правильный ответ, и спасибо за ссылку на другой, было довольно сложно найти правильное ключевое слово. - person user3804927; 20.11.2014

Вы можете исправить это, используя

List<ArrayList<? extends Library<?>>> listTopLibrary = new ArrayList<>();
person ashokramcse    schedule 20.11.2014

ArrayList<Library<?>> не является супертипом ArrayList<Library<Photo>>

Вы должны объявить listTopLibrary как

ArrayList<ArrayList<? extends Library<?>>> listTopLibrary
person Misha    schedule 20.11.2014