泛型是通过类型擦除来实现的.
编译器在编译时,擦除了所有类型相关的信息.
运行时不存在任何类型相关的信息.
例如:List 在运行时仅用一个 List 来表示。
这样做的目的,是确保能和 Java 5 之前的版本开发二进制类库进行兼容。
泛型信息只存在于代码编译阶段,在进入JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除。
在泛型类被类型擦除的时候,如果类型参数没有指定上限,如 < T > 会被转译成普通的 Object 类型,如果指定了上限如 < T extends String > 则类型参数就被替换成类型上限。
- 两个 String 只有第一个起作用,只不过JDK7 才开始支持 List list=new ArrayList<> ();这种写法。
- 第一个String就是告诉编译器,List 中存储的是String对象,也就是起类型检查的作用,之后编译器会擦除泛型占位符,以保证兼容以前的代码。
- < ? > 表示了非限定通配符,因为 < ? > 可以用任意类型来替代。
限定通配符对类型进行了限制。有两种限定通配符.
- < ? extends T > 通过确保类型必须是T的子类来设定类型的上界,
- < ? super T >通过确保类型必须是T的父类来设定类型的下界。
List< ? extends T > 可以接受任何继承自 T 的类型的 List,
List < ? super T > 可以接受任何 T 的父类构成的 List。
例如 List< ? extends Number > 可以接受 List< Integer > 或 List< Float > 。
Array 不支持泛型,要用List 代替 Array,List 可以提供编译器的类型安全保证,而 Array却不能。
泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。



