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和?有什么区别?