Я должен быть смущен здесь.
Я везде читал, что в генериках массивы параметризованных типов недопустимы.
Пример из 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];
Я делаю именно это, он прекрасно компилируется (я использую eclipse), но получаю ошибку исключения приведения класса (объект не может быть приведен к MyEntry):
Мой вопрос: почему эта строка компилируется в первую очередь?
Я думал, что это создание запрещено компилятором.
Что я здесь делаю неправильно / иначе?
ОБНОВЛЕНИЕ:
На той же странице, почему я могу успешно сделать:
List<E> elements[] = (List<E>[])new LinkedList[capacity];
и не имеют никаких исключений времени выполнения ?
ОБНОВЛЕНИЕ:
Везде, где я читал (упоминал Лангера, поскольку она часто цитируется), говорится, что это объявление (массивы параметризованных типов) запрещено компилятором.
Я могу понять, что происходит после этого.
Я не могу понять, почему компилятор не сообщает об ошибке.
Я не осуждаю, я говорю везде, где читаю, там говорится, что это не компилируется.
Я что-то не так читаю?
UPDATE:
Я видел некоторые комментарии, связанные с отсутствующим параметром в части new
.
Это также имеет нет проблема:
List<Entry<KeyType, ValueType>> table[] = (List<Entry<KeyType, ValueType>>[])new LinkedList[capacity];