我不太了解泛型,也许还不太了解Type Erasure的概念和限制。因此,如果在编译过程中删除了类型信息,为什么此代码在运行时而不是编译时给我一个异常?我知道泛型是经过精心设计以与旧版本兼容的,但是我不明白为什么如果在运行时类型变成对象,为什么它会返回异常?不应该在编译时?对不起,如果您听不懂,我不会说英语。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
add(list, 1l);
for(String n : lista) {
System.out.println(n);
}
}
public static void add(List l, Long lNumber ) {
l.add(lNumber);
}
答案 0 :(得分:1)
public static void main(String[] args) {
List<String> list = new ArrayList<>();
add(list, 1l);
// On compile time: list contains only String, so no error
// ON runtime: list has a Number that you added before, and Number -> String throws ClassCastException
for(String n : list) {
System.out.println(n);
}
}
// List here has elements with type Object. you add a Number
// At compile time: you get a warning only
public static void add(List l, Long lNumber ) {
l.add(lNumber);
}