昨天心有不甘,觉得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果然有坑。。。)