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