Как указать ArrayList & lt; String & gt; [] в Java [duplicate]

Хорошо, я признаю, что это была действительно тупое дело, которое когда-то случалось для меня. Я изменил тег сценария, чтобы указать на нужное содержимое, и изменил порядок скриптов, чтобы он был правильным в редакторе ... но полностью забыл сохранить изменения; (Вы могли бы смеяться сейчас, но когда вы устали от всех странных могут возникнуть проблемы. I

1
задан Tegiri Nenashi 3 March 2012 в 02:02
поделиться

3 ответа

Массивы конкретных параметризированных типов по своей сути нарушаются. Помните, что массивы ковариантны, а проверка типа массива - это операция выполнения. Во время выполнения все дженерики стираются, поэтому проверка хранилища массива не может <Pair<ParseNode, ParseNode>> из <Pair<BigInteger,IOException>>.

. Основной контракт общего типа «Я, компилятор, обещаю, что если вы пишете код, который не генерирует никаких предупреждений, вы никогда не получите исключение класса при выполнении во время выполнения ».

Также компилятор не гарантирует вам, что он сможет дать вам ошибку времени компиляции, если что-то, что а не ArrayList<Pair<ParseNode,ParseNode>> помещается в этот массив. Кроме того, система времени выполнения не гарантирует, что вы получите исключение ArrayStoreException (например, спецификация языка), если вы добавите неправильный тип, а не ClassCastException позже, когда вы его отпустите. (Вторая часть действительно, почему это фактически незаконно, а не просто предупреждение, это приведет к массиву, который не подчиняется спецификации языка.)

Поэтому он не позволяет вам объявлять их таким образом и заставляет вас признать «небезопасное» предупреждение. Таким образом, он сказал: «Я сказал вам, что не могу гарантировать, что в результате использования этого массива не будет исключений для исключения классов, вам нужно убедиться, что вы только поместили здесь правильные вещи».

8
ответ дан Affe 26 August 2018 в 16:03
поделиться

Java не поддерживает общие массивы. Массивы ковариантны, дженериков нет. Это означает, что если класс A расширяет класс B, то A [] также является B []. И код

A[] a = new A[10];
B[] b = a;

является законным.

Но это не так для дженериков. Вы не могли бы назначить Foo<T> на Foo<X>, даже если T расширяет X. И поэтому элементы Foo<T>[] не могут быть гарантированы безопасным типом.

EDIT Извините меня за просто ссылку, ve found Теория и практика Java: статья generics gotchas , которая объясняет все о ковариации массивов лучше, чем я даже мечтал.

5
ответ дан Mersenne 26 August 2018 в 16:03
поделиться

Не используйте массив. Используйте другой ArrayList.

ArrayList<List<Pair<ParseNode,ParseNode>>> listOfLists = new ArrayList<List<Pair<ParseNode,ParseNode>>>();

listOfLists.add(new ArrayList<<Pair<ParseNode,ParseNode>>());
0
ответ дан Skip Head 26 August 2018 в 16:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: