Начиная с Java 13, создание универсального массива по-прежнему запрещено.Причина в том, что массивы знают свой тип компонента во время выполнения, но генерики страдают от того, что известно как стирание типа .Тем не менее, ваш вопрос имеет следующий пример:
daysOfWeek = new ArrayList<String>[]{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
Выше пытается создать ArrayList<String>[]
;другими словами, массив списков массивов.Скорее всего, это не то, что вы действительно хотите сделать.Несмотря на имя ArrayList
, класс не участвует напрямую в создании массивов - имя просто означает, что список поддерживается массивом.Учитывая, что ваши данные - это просто название каждого дня недели, вы, вероятно, захотите: String[]
или List<String>
:
// array
String[] daysOfWeek = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
// list
List<String> daysOfWeek = new ArrayList<>(List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"));
Обратите внимание, что если вы не используете Java 11+, выможет заменить использование List#of
на Arrays#asList(T...)
.Если вы используете Java 11+, рассмотрите возможность использования результата List#of
напрямую, а не копируйте результат в модифицируемую ArrayList
(при условии, что вы не планируете изменять список).
Вы можетеТакже вы можете рассмотреть возможность использования перечисления java.time.DayOfWeek
вместо String
для представления каждого дня недели.Перечисление более безопасно для типов, менее подвержено ошибкам и позволяет легко взаимодействовать с любыми другими java.time
классами, которые вы можете использовать.
List<DayOfWeek> daysOfWeek = List.of(DayOfWeek.values());
Вы должны по умолчанию использовать List
(или некоторая другая коллекция) перед использованием массива.Если вам абсолютно необходимо использовать массив, вы можете обойти ошибку «создания универсального массива» следующим образом:
// unbounded T
@SuppressWarnings("unchecked")
T[] array = (T[]) new Object[size];
// or if, for instance, T is upper-bounded by CharSequence
@SuppressWarnings("unchecked")
T[] array = (T[]) new CharSequence[size];
// or if the component type is itself generic
@SuppressWarnings("unchecked")
Comparator<String>[] array = (Comparator<String>[]) new Comparator[size];
Однако все вышеперечисленное - просто трюк во время компиляции.Каждый из массивов по-прежнему позволяет хранить любой объект, который является экземпляром типа необработанного компонента, без выброса ArrayStoreException
во время выполнения.Другими словами, первый массив будет по-прежнему принимать любые Object
, второй массив будет по-прежнему принимать любые CharSequence
, а третий массив по-прежнему будет принимать любые Comparator<?>
.Вот почему для каждого из вышеперечисленных сообщений выдается предупреждение «unchecked cast»;то есть, если бы не было @SuppressWarnings("unchecked")
аннотации.