天天看點

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和?有什麼差別?