Если у меня есть общий класс Foo<Bar>
, мне не разрешено создавать массив следующим образом:
Bar[] bars = new Bar[];
(Это приведет к ошибке "Невозможно создать общий массив Bar" ).
Но, как было предложено dimo414 в ответе на этот вопрос (Java: как создать Generic Array), я могу сделать следующее:
Bar[] bars = (Bar[]) new Object[];
(Это будет "только" генерировать предупреждение: "Тип безопасности: снят флажок с объекта [] на бар []" ).
В комментариях к ответам dimo414 некоторые люди утверждают, что использование этой конструкции может вызвать проблемы в определенных ситуациях, а другие говорят, что это нормально, поскольку единственная ссылка на массив - bars
, которая уже имеет нужный тип.
Я немного запутался, в каких случаях это нормально, и в каких случаях это может вызвать у меня проблемы. Комментарии newacct и Aaron McDaid, например, кажутся прямо противоречащими друг другу. К сожалению, поток комментариев в исходном вопросе просто заканчивается без ответа "Почему это" уже не правильно "?", Поэтому я решил задать для него новый вопрос:
Если bars
-array только когда-либо содержит записи типа Bar
, могут ли быть какие-либо проблемы во время выполнения при использовании массива или его записей? Или это единственная опасность, что во время выполнения я мог технически применить массив к чему-то другому (например, String[]
), что позволило бы мне заполнить его значениями, отличными от Bar
?
Я знаю, что вместо Array.newInstance(...)
можно использовать Array.newInstance(...)
, но я специально интересуюсь конструкцией литья типов выше, поскольку, например, в GWT newInstance(...)
-option недоступен.