Генерирование Java и инициализация массива

В чем объясняется следующее:

public class GenericsTest { //statement 1 public ArrayList[] lists; public GenericsTest() { //statement 2 lists = new ArrayList[4]; } } 

Компилятор принимает оператор 1. Оператор 2 помечен компилятором для «создания общего массива».

Хорошее объяснение, которое я видел относительно отказа от общих массивов, – это тот , который утверждает, что поскольку массивы являются ковариантными, а дженерики – это не то, что вы можете подорвать типичную типизацию, если вы разрешили общие массивы.

Оставляя в стороне аргумент о том, должен ли язык идти на крайние этапы создания такого сложного несоответствия в лечении дженериков, чтобы вы не стреляли в себя, как бы вы ни старались (и если кто-нибудь знает о хороших дискуссиях относительно родственников достоинства / недостатки проблемы, пожалуйста, напишите мне, мне было бы интересно увидеть аргументы), почему утверждение (1) должно быть разрешено, если (2) нет?

Кажется, что есть неясные случаи, когда вы можете непреднамеренно вызвать ClassCastException, как описано здесь http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf (раздел 7.3)

интересную дискуссию по этой теме можно найти здесь http://courses.csail.mit.edu/6.170/old-www/2006-Spring/forum/index.php%3Ftopic=324.msg1131.html

Это потому, что вы не можете создать, но вы можете использовать их:

 public class GenericsTest { //statement 1 public ArrayList[] lists; public GenericsTest() { //statement 2 lists = new ArrayList[4]; //statement 3 lists[0].add(new Integer(0)); //statement 4 lists[0].add(new String("")); } } 

Утверждение 3 возможно, утверждение 4 приведет к ошибке компилятора.

Итак, актуальный вопрос: почему нет ошибки для объявления общего массива? ?

Вы всегда будете получать ошибку в том месте, где вы делаете что-то ошибочное. Добавление ошибки, когда технически проблема не возникает, просто добавляет к беспорядку (хотя редактор может захотеть указать это на вас).

В некоторых случаях вам может понадобиться немного свести правила с помощью неконтролируемого актерского состава. Нет необходимости принудительно заставлять код засорять больше предупреждений, чем необходимо (кроме указания глупости).

В этом случае я бы не стал использовать массивы именно по этой причине. Объявление «списков» в вашем исходном коде может быть

 List> lists = new ArrayList>(4); for(int i = 0; i < 4; i++) lists.add(null); // or add an empty ArrayList 

(вы должны использовать интерфейс, а не реализацию в объявлениях переменных)

Вместо синтаксиса array [] вы должны использовать get () или set (). Кроме этого, это эквивалентно.

  • Swift: передать массив по ссылке?
  • Как скопировать часть массива в другой массив в C #?
  • MongoDB - запрос последнего элемента массива?
  • Java: multidimensional array против одномерного
  • Сравнение массивов в утверждениях JUnit, сжатый встроенный способ?
  • Как создать и использовать multidimensional array в Scala?
  • Redim сохранить в C #?
  • Как суммировать массив целых чисел в C #
  • Преобразование массива объектов в массив их примитивных типов
  • Как сортировать быстрый массив, содержащий экземпляры подclassа NSManagedObject, по значению атрибута (date)
  • Хранение массивов в базе данных: JSON и сериализованный массив
  • Давайте будем гением компьютера.