Java和类型擦除

时间:2019-09-02 19:52:44

标签: java type-erasure

我不太了解泛型,也许还不太了解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);
    }

1 个答案:

答案 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);
}