Инициализация массива листов

170
14 сентября 2017, 15:28

Нужно задействовать массив листов при инициализации таким образом

List<String>[] FinishFile = new ArrayList<String>[12];

Eclipse выдал ошибку:

Cannot create a generic array of ArrayList

в итоге прокатил такой вариант

List<String>[] FinishFile = new ArrayList[12];

Почему?

Answer 1

Это связано с тем, что компилятор не может вам гарантировать типобезопасность (type safety) для массивов обобщенных типов, потому что массив может быть приведен к более широкому типу (с потерей информации от обобщенном типе).

Например, если бы первый вариант работал, это приводило бы к таким ситуациям:

List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
List<String>[] a = new ArrayList<String>[5]; // предположим, это допустимо
Object[] o = a;   // вполне разрешенный upcast, но информация о generic типе потерялась
o[0] = ints;
String s = a[0].get(0); // ошибка приведения типа во время выполнения программы

Система generics же в Java направлена на проверку типов и гарантии безопасности типов как раз на этапе компиляции. Поэтому вы будете вынуждены написать:

List<String>[] a = new ArrayList[5]; 

и получите Warning от компилятора и предупреждение в IDE, после которого ответственность за потенциальные ошибки перекладывается на вас.

PS. Вообще массив коллекций — довольно сомнительная практика, обычно массивы применяются для примитивных типов там, где есть какие-то вычисления или сериализация/десериализация в бинарные данные.

Используйте List<List<String>> и живите в типобезопасном мире.

READ ALSO
Изменить значение ключа в файле JSON

Изменить значение ключа в файле JSON

Читаю данные из json с помощью GsonИ в одном активити я хочу изменить значения ключа одного обьекта

357
Android: Не парсится JSON и не выводятся в listview

Android: Не парсится JSON и не выводятся в listview

Я пишу REST клиент, для парсинга JSON'a, я использую для этого Retrofit 2

278
ajax работа с всплывающими окнами

ajax работа с всплывающими окнами

Есть раскрывающееся по наведению курсора меню, работа которого протестированаЕсть список

276