Java 11+ ошибка «создания универсального массива» (с использованием BlueJ) - PullRequest
0 голосов
/ 23 сентября 2019

Я новичок в Java и использую текущую версию BlueJ для программирования.При попытке инициализировать строковый массив, содержащий все дни недели, меня приветствует сообщение об ошибке «создание универсального массива». Мне любопытно, как это исправить, поскольку все результаты, которые я нашел в Интернете, были довольно старыми и не подходящими.свидание.Код для часов, которые также могут отслеживать день недели.У меня есть следующий код:

daysOfWeek = new ArrayList<String>[]{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

Я буду более чем рад обновить этот пост любой другой информацией, которая может потребоваться для оказания помощи.Спасибо за ваше время.

1 Ответ

3 голосов
/ 23 сентября 2019

Начиная с 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") аннотации.

...