Здесь фрагмент кода:
import java.util.*;
class Test
{
public static void main(String[] args)
{
List<Integer> list = new ArrayList<>();
addToList(list);
Integer i = list.get(0); //#1 fails at run-time
String s = list.get(0); //#2 fails at compile-time
list.get(0); //#3 works fine
System.out.println(list.get(0)); //#4 works fine, prints "string"
}
static void addToList(List list){
list.add("string");
}
}
Я понимаю, почему можно вставить объект класса String в параметризованный список.
Похоже, я понимаю, почему код, помеченный #1
и #2
, не работает.
Но почему работают #3
и #4
? Насколько я понимаю, компилятор добавляет соответствующие отбрасывания после стирания типа, поэтому, когда я вызываю list.get(0)
, этот метод должен возвращать объект, ранее заданный в Integer. Итак, почему ClassCastException не встречается на # 3 и # 4 во время выполнения?