Почему Java не допускает создание универсальных массивов?

Существует много вопросов на stackoverflow от людей, которые попытались создать массив дженериков как так:

ArrayList<Foo>[] poo = new ArrayList<Foo>[5];

И ответ, конечно - то, что спецификация Java не позволяет Вам объявлять массив дженериков.

Мой вопрос однако состоит в том почему? Что техническая причина лежит в основе этого ограничения на языке Java или Java vm? Это - техническое любопытство, о котором я всегда задавался вопросом.

19
задан abksrv 14 February 2016 в 14:22
поделиться

4 ответа

Массивы овеществлены - они сохраняют информацию о типе во время выполнения.

Generics - это конструкция времени компиляции - информация о типе теряется во время выполнения. Это было преднамеренное решение, чтобы обеспечить обратную совместимость с байткодом Java до появления генериков. Следствием этого является то, что вы не можете создать массив типа generic, потому что к тому времени, когда виртуальная машина захочет создать массив, она не будет знать, какой тип использовать.

13
ответ дан 30 November 2019 в 04:44
поделиться
5
ответ дан 30 November 2019 в 04:44
поделиться

Вот старый пост в блоге, который я написал, где я объясняю проблему: Причуды универсальных Java-шаблонов

См. Как в общем случае создавать объекты и массивы? из FAQ по Java Generics Анжелики Лангер для обходной путь (вы можете сделать это с помощью отражения). Этот FAQ содержит все, что вы когда-либо хотели знать о дженериках Java.

3
ответ дан 30 November 2019 в 04:44
поделиться

Вы вынуждены использовать

ArrayList<Foo>[] poo = new ArrayList[5];

, что даст вам непроверенное предупреждение. Причина в том, что существует потенциальная проблема безопасности типов с универсальными шаблонами и поведением проверки типов массивов Java во время выполнения, и они хотят убедиться, что вы знаете об этом при программировании. Когда вы пишете new ArrayList [...] , вы создаете что-то, что во время выполнения будет проверять все, что в него помещается, чтобы убедиться, что это экземпляр ArrayList . Следуя этой схеме, когда вы выполняете new ArrayList [...] , вы ожидаете создать что-то, что проверяет во время выполнения все, что попадает в него, чтобы убедиться, что это экземпляр ] ArrayList . Но это невозможно сделать во время выполнения, потому что во время выполнения нет общей информации.

0
ответ дан 30 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

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