2015-05-28 2 views
2
private void readList(ArrayList list){ 
    list.add("Hello"); 
    list.add(2); 
} 

public void run(){ 
    setFont("Courier-24"); 
    ArrayList<Integer> list = new ArrayList<Integer>(); 
    readList(list); 
    println("list = "+list); 
    println("Type of list[1] = "+list.get(1).getClass()); 

} 

Результат:
список = [Hello, 2]
Тип списка [1] = класс java.lang.Integerпример типа стирания и мое понимание

public void run(){ 
    setFont("Courier-24"); 
    ArrayList<Integer> list = new ArrayList<Integer>(); 
    readList(list); 
    println("list = "+list); 
    println("Type of list[0] = "+list.get(0).getClass()); 

} 


Результат:
список = [Hello, 2]
Исключение в потоке java.lang.ClassCastException "Thread-2":
java.lang.String не может быть приведен к java.lang.Integer

После прочтения что-то о type erasure, я получил мое предположение:

Когда я называю readList(list), это на самом деле добавив вещи в список, который ' ложно "рассматривается как тип ArrayList, поэтому нет ошибки (это мое понимание так называемого type erasure). Но если я назову println("Type of list = "+list.get(0).getClass()); в run(), наступает ошибка, потому что list[0] имеет тип String (тогда как println("Type of list = "+list.get(1).getClass()); не потому, что список [1] ​​имеет тип Integer).

Как будто какой-то преступник сбежал с места преступления сначала (потому что он принадлежит нормальным людям, а нормальные люди имеют свободу), а позже, когда полиция начинает проверять всех, кто был вокруг, его поймали, потому что он преступник в глубине ?

+1

* «Как будто какой-то преступник сбежал с места преступления сначала (потому что он принадлежит нормальным людям, а нормальные люди имеют свободу), а позже, когда полиция начинает проверять всех, кто был вокруг, его поймали, потому что он преступник в глубине? »Да, это так. – Radiodef

ответ

1

Ходить по type erasure принципам ваш метод должен выглядеть

private void readList(ArrayList<Integer> list){ 
    list.add(1); 
    list.add(2); 
} 

будет очевидно, что добавление строки в массив целых чисел не является хорошей идеей.

1

Когда вы говорите

private void readList(ArrayList list){ 

, не печатает стиранию. Это пример raw type. Согласно Java Tutorials,

сырье типа это имя общего класса или интерфейса, без каких-либо аргументов типа.

до того, как дженерики были добавлены в Java, были только необработанные типы.

В constrast type-erasure - это оптимизация. Дженерики - это функция проверки типа времени компиляции, нет производительность воздействие, потому что общие типы не являются проверено на время выполнения.

В байтовый код введен тип.

Смежные вопросы