Я должен быть здесь смущен.Java Generics: Массирование массивов с параметризованными типами: незаконно?
Я читал всюду, что в массивах generics массивы параметризованных типов являются незаконными.
Пример из AngelikaLanger:
static void test() {
Pair<Integer,Integer>[] intPairArr = new Pair<Integer,Integer>[10] ; // error
addElements(intPairArr);
Pair<Integer,Integer> pair = intPairArr[1];
Integer i = pair.getFirst();
pair.setSecond(i);
}
Цитата Лангер (но везде я прочитал это говорит то же самое):
Компилятор запрещает создание массивов которого компонент типа является бетона параметризованный тип, например, пара в нашем примере . Мы обсудили в предыдущей статье, почему разумно , что компилятор квалифицирует пару [] как незаконную.
До сих пор хорошо.
Но в моем коде здесь:
private MyEntry<E> [] elements = (MyEntry<E>[])new Object[capacity];
я точно, что он компилируется нормально (я использую затмение), но получает ошибку класса литой исключении (Объект не может быть приведен к MyEntry):
Вопрос в том, почему эта линия компилируется в первую очередь?
Я думал, что этот экземпляр не разрешен компилятором.
Что я делаю неправильно/differerent здесь?
UPDATE:
На той же странице, почему я в состоянии не сделать успешно:
List<E> elements[] = (List<E>[])new LinkedList[capacity];
и имеют никаких исключений во время выполнения?
UPDATE:
Везде я прочитал (упомянутый Langer, так как она часто цитируется) он говорит, что эта декларация (массивы параметризованных типов) отвергается компилятором.
Я могу понять, что происходит после этого.
Я не могу понять, почему компилятор не сообщает об ошибке.
Я не сужу, я говорю везде, где я читаю, он говорит, что это не компилируется.
Я что-то пропустил?
UPDATE: Я видел некоторые комментарии, связанные с недостающим параметром в new
части.
Это также не имеет не вопроса:
List<Entry<KeyType, ValueType>> table[] = (List<Entry<KeyType, ValueType>>[])new LinkedList[capacity];
'LinkedList' реализует' List', так что ** downcast ** является приемлемым; 'Object' не является подклассом' MyEntry', так что ** upcast ** вызывает ошибку. – Viruzzo
Пожалуйста, прочитайте обновленный OP – Cratylus
Вы делаете 'новый LinkedList []': там есть параметр ** no ** type, поэтому проблем нет; что вы не можете сделать, это 'new LinkedList []'. Выполнение типизированного приведения не имеет ничего общего с тем, что вы не можете выполнить инициализацию и из-за типа erasure '(List [])' во время выполнения становится '(List [])', действительным списком для 'new LinkedList [] '. –
Viruzzo