天天看点

java 泛型中的T、?、<? extends T>、<? super T>

1.泛型中的T

指定某一类型,一旦指定则只能为该类型

public static <T> void show1(List<T> list){
 for (Object object : list) {
        System.out.println(object.toString());
    }
}
           

测试:

List<Student> list1 = new ArrayList<>();
   list1.add(new Student("zhangSan",18,0));
   list1.add(new Student("liSi",28,0));
   //这里如果add(new Teacher(...));就会报错,因为我们已经给list1 指定了数据类型为Student

   List<Teacher> list2 = new ArrayList<>();
   list2 .add(new Teacher("yangFei",48,0));
   list2 .add(new Teacher("zhouPing",36,0));
   //这里如果add(new Student(...));就会报错,因为我们已经给list2 指定了数据类型为Teacher
           

2.泛型中的?

通配符,当赋值的类型不确定的时候,我们用通配符 ? 代替

public static <?> void show2(List<?> list){
 for (Object object : list) {
        System.out.println(object.toString());
    }
}
           

测试:

//这里没有给List指定具体的数据类型,可以存放Student、Teacher等多种类型数据
   List list2 = new ArrayList<>();
   list2.add(new Student("zhaoliu",22,1));
   list2.add(new Teacher("sunba",30,0));
           

3.泛型中的<? extends T>

例如,以下三个声明都是合法的:

List<? extends Number> number1 = new ArrayList<Number>();  // 接受 Number的子类 如 Number本身
List<? extends Number> number2 = new ArrayList<Integer>(); // 接受 Number的子类 如 Integer
List<? extends Number> number3 = new ArrayList<Double>();  // 接受 Number的子类 如 Double
           

注意:不能向number1 、number2、number3中add值。

因为number1 可能指向 List<Double>,

number2 可能指向 List<Integer>,

number3 可能指向 List<Integer>,

4.泛型中的<? super T>

例如,以下三个声明都是合法的:

List<? super Integer> list1 = new ArrayList<Integer>();  // 接受Integer的父类 如 Integer本身
List<? super Integer> list2 = new ArrayList<Number>();   //接受Integer的父类 如 Number
List<? super Integer> list3 = new ArrayList<Object>();  // 接受Integer的父类 如 Object
           

注意:list1 、list2、list13都可以add,但是只能添加 Integer 类型的值,不能添加Double、 Number和Object 类型的值,因为可能指向 ArrayList<Integer>。

list1.add(11);
list2.add(12);
list3.add(13);

Integer a = (Integer) list1.get(0);
Integer b = (Integer) list2.get(0);
Integer c = (Integer) list3.get(0);
        
System.out.println(a);//11
System.out.println(b);//12
System.out.println(c);//13
           

参考:

Difference between <? super T> and <? extends T> in Java [duplicate]

泛型中占位符T和?有什么区别?