Подтвердить что ты не робот

Почему Java не позволяет создавать общие массивы?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 3

Вот старое сообщение в блоге, в котором я писал, где я объясняю проблему: Привычки дженериков Java

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

Ответ 4

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

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

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