当使用泛型或者泛型接口,传递的数据中,泛型的类型不确定,可以通过通配符<?>表示。一旦程序当中使用泛型的通配符后,只能使用Object类中的共性的方法,集合中元素自身方法无法使用。
通配符的基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?代表未知的通配符。
此时只能接收数据,不能往集合中存储数据。
代码实例:
public static void main(String[] args){
//可以存储整数的集合
Collection<Integer> list01 = new ArrayList<Integer>();
//此时list01可以存储整数的数据
//展示list01集合当中的数据
getElement(list01);
//可以存储String字符串集合
Collection<String> list02 = new ArrayList<String>();
//此时list02可以存储字符串的数据
//getElement(list02);//如果方法的接受的行参类型的集合的泛型是Object,那么这么写是错误的 Collection<Object> x 不可以的
//此时如果换成泛型通配符?就可以接收
getElement(list02);//可以
}
/*public static void getElement(Collection<Object> coll){
}*/
public static void getElement(Collection<?> coll){
//只能接收Integer类型的数据
//此时?可以代表任意类型
}
备注:泛型不存在继承关系 Collection list = new ArrayList();这是一种错误的写法。
通配符的高级使用------受限泛型
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以,但是java的泛型当中还可以指定一个的泛型的上限和下限
泛型的上限
- 格式:类型名称<? extends 类型>对象名称
- 意义:只能接受该类型及其子类
泛型的下限 - 格式:类型名称<? super 类名>对象名
- 意义:只能接收该类类型及其父类类型
比如说:已知的顶级父类的Object,String类,Number类,Integer,其中Number类是Integer的父类
示例代码
/**
* 泛型的上限限定: ? extends E 代表使用的泛型只能是E类型或者是E类型的子类
* 泛型的下线限定 ? super E 代表使用的泛型只能是E类型或者E类型的父类类型
*/
/**
* 类与类之间的继承关系
* Integer extends Number extends Object
*/
public static void main(String[] args){
Collection<Integer> list01 = new ArrayList<>();
Collection<String> list02 = new ArrayList<>();
Collection<Number> list03 = new ArrayList<>();
Collection<Object> list04 = new ArrayList<>();
//调用方法getElement1();可以接收Number的子类
getElement1(list01);
//getElement1(list02);//不可以接收与number无关的类
getElement1(list03);
//getElement1(list04);//不可以接收number的父类类型
//getElement2(list01);//不可以接收Number的子类类型Integer
//getElement2(list02);//不可以接收和Number无关的类型
getElement2(list03);//可以接收自己的本身类型
getElement2(list04);//可以接受number的父类类型
}
//定义使用泛型的上限 只能接受Number数字类及其子类
public static void getElement1(Collection<? extends Number> coll){}
//定义使用泛型的下限,只能接收Number数字类型及其父类类型
public static void getElement2(Collection<? super Number> coll){}