Может кто-нибудь объяснить мне, почему это происходит:Дженерики и тип стирания
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
?
Спасибо.
Я не получаю исключение во время выполнения, но мне нужно было добавить дополнительный код, чтобы компилировать вещи и создавать «элементы», и это, вероятно, не то же самое, что и ваш код. Я думаю, нам нужно увидеть более полный пример. – ajb
Дженерики и массивы не работают вместе на Java, к сожалению – hoaz
@hoaz. Некоторые комбинации дженериков и массивов являются незаконными в Java, и компилятор будет отмечать ошибку. Но если программа компилируется, я думаю, что программа должна работать так, как ожидалось, но вопросник говорит, что есть исключение во время выполнения. Однако я не смог его получить. – ajb