一、JAVA的泛型通配符:?(super和extends)
假设给定的泛型类型为G,(如List<E>中的List),两个具体的泛型参数X、Y,当中Y是X的子类:
- G<? extends Y> 是 G<? extends X>的子类型(如List<? extends Cat> 是 List<? extends Animal>的子类型)。
- G<X> 是 G<? extends X>的子类型(如List<Animal> 是 List<? extends Animal>的子类型)
- G<?> 与 G<? extends Object>等同,如List<?> 与List<? extends Objext>等同。
Plate<? extends Fruit>
是Plate<Fruit>
以及Plate<Apple>
的基类。这种不能往里面存,只能取。
Plate<? super Fruit>
是Plate<Fruit>
的基类,但不是Plate<Apple>
的基类。这种只能往里面存,不能取。要取也只能取在Object对象里。
二、一个经典的实例:
package org.eclipse.winery.repository; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class Main2 { public static void main(String[] args) { // TODO Auto-generated method stub List<Obj> list = new ArrayList<Obj>(); list.add(new Obj()); List<?> list2 = list; list2.forEach((obj) -> System.out.println(((Obj) obj).name)); Collection<?> list3 = list; list3.forEach((obj) -> System.out.println(((Obj) obj).name)); Collection<Obj> list4 = list; list4.forEach((obj) -> System.out.println(((Obj) obj).name)); } private static class Obj { public String name = "Soar up into the sky with one start!"; } }
从这里我们看出了Collection<Obj>是List<Obj>的父类
三、泛型的静态方法
静态方法有一种情况需要注意一下,那就是在类中的静态方法使用泛型:静态方法无法访问类上定义的泛型;如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。
即:如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。