2014-11-20 1 views
4

У меня есть следующий общий вид:Возможно ли использовать список общего типа в 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>>) 

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

ответ

2

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

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

Тщательное объяснение, почему можно найти на Java nested generic type

+0

Спасибо, что это правильный ответ, и спасибо за ссылку на другую, было довольно сложно найти правильное ключевое слово. – user3804927

0

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

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

ArrayList<ArrayList<? extends Library<?>>> listTopLibrary 
1

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

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