List的可协变性疑问(二)

昨天心有不甘,觉得Java的开发人员不可能出现这种错误的,所以又继续的看资料。

其实容器是分为元类型和和泛型(可能我扯中文太蛋疼了)。。实际意思就是对于编译器来说List<Object>和List不是一个事情,但是最终编译器会替我们将List<Type>的类型擦除,最终JVM看到的其实还是List而不是List<Object>然后做强制转换的。我们反编译一下这个java文件的class看看就清晰了。

package com.company;

import java.util.ArrayList;
import java.util.List;

public class Main {

    private List<A> A = new ArrayList<>();

    public void add(A a) {
        A.add(a);
    }

    public void add(B b) {
        A.add(b);
    }

}

class A {
    public A() {
        System.out.println("I'm A");
    }
}

class B extends A {
    public B() {
        System.out.println("I'm B");
    }
}

反编译结果如下

无标题

 

 

 

所以对于Java来说,泛型都是伪泛型的说法就是这里来的了。

那么在Java8之中为什么会出现明明是List<A>里面可以出现B的实例了。。。。(Java果然有坑。。。)