文章目录
泛型通配符
如上图所示,print方法下就确定泛型类型的话,不是很方便,无法打印其他泛型类型的集合元素,因此,需要用到泛型通配符------"?"。若改成 public static void print(ArrayList<?> list),则不会出现上述问题。
注意:1.在定义集合泛型的时候不能用通配符,会报错,它只用于接收数据!
2.另外,泛型没有继承的概念,所以不能用object来接收数据。
3. 如果使用迭代器来遍历输出元素,在用next方法接收的时候用object来定义变量名。
2.
3.
通配符高级使用–受限泛型
-
泛型的上限限定: ? extends E 代表使用的泛型只能是E类型的子类/本身
-
泛型的下限限定: ? super E 代表使用的泛型只能是E类型的父类/本身
已知Java中:
- Integer extends Number extends Object
Integer是Number的子类是Object的子类
-
String extends Object
String是Object的子类观察下面代码及报错:
public class Demo06Generic {
public static void main(String[] args) {
Collection<Integer> list1 = new ArrayList<Integer>();
Collection<String> list2 = new ArrayList<String>();
Collection<Number> list3 = new ArrayList<Number>();
Collection<Object> list4 = new ArrayList<Object>();
getElement1(list1);
//getElement1(list2);//报错
getElement1(list3);
//getElement1(list4);//报错
//getElement2(list1);//报错
//getElement2(list2);//报错
getElement2(list3);
getElement2(list4);
/*
类与类之间的继承关系
Integer extends Number extends Object
String extends Object
*/
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}
}