Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

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

Нужно задействовать массив листов при инициализации таким образом
List[] FinishFile = new ArrayList[12];
Eclipse выдал ошибку:
Cannot create a generic array of ArrayList
в итоге прокатил такой вариант
List[] FinishFile = new ArrayList[12];
Почему?


Ответ

Это связано с тем, что компилятор не может вам гарантировать типобезопасность (type safety) для массивов обобщенных типов, потому что массив может быть приведен к более широкому типу (с потерей информации от обобщенном типе).
Например, если бы первый вариант работал, это приводило бы к таким ситуациям:
List ints = new ArrayList(); ints.add(1);
List[] a = new ArrayList[5]; // предположим, это допустимо Object[] o = a; // вполне разрешенный upcast, но информация о generic типе потерялась o[0] = ints;
String s = a[0].get(0); // ошибка приведения типа во время выполнения программы
Система generics же в Java направлена на проверку типов и гарантии безопасности типов как раз на этапе компиляции. Поэтому вы будете вынуждены написать:
List[] a = new ArrayList[5];
и получите Warning от компилятора и предупреждение в IDE, после которого ответственность за потенциальные ошибки перекладывается на вас.


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

Комментариев нет:

Отправить комментарий