Может ли кто-нибудь объяснить мне, почему это происходит:
public class Array<E> {
public E[] elements = (E[]) new Object[10];
public E get(int idx) {
return elements[idx]; // Ignore bound-checking for brevity.
}
public static void doSomething(Array<Integer> arr) {
Integer good = arr.get(0);
Integer bad1 = arr.elements[0];
Integer bad2 = ((Integer[]) arr.elements)[0];
Integer bad3 = (Integer) arr.elements[0];
// `bad1', `bad2', and `bad3' all produce a
// runtime exception.
}
public static void main(String[] args) {
Array<Integer> test = new Array<>();
Array.doSomething(test);
}
}
Полный пример здесь: http://pastebin.com/et7sGLGW
Я читал о стирании типов и понимаю, что проверка типов выполняется во время компиляции, а затем E
просто заменяется на Object
, поэтому все, что у нас есть, это public Object[] elements
, но почему метод get
работает успешно, а обычное приведение типов — нет? Разве тип возвращаемого значения метода get
также не стирается?
Спасибо.
elements
, и, вероятно, это не то же самое, что ваш код. Я думаю, нам нужно увидеть более полный пример. - person ajb   schedule 16.10.2014Object o = arr.elements[0];
приводит к ` java.lang.ClassCastException: [Ljava.lang.Object; нельзя преобразовать в [Ljava.lang.Integer. This tells me that the cast that fails is the original
Object[]` вInteger[]
! - person   schedule 16.10.2014