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