说明
当使用泛型类或者接口时,传递的数据中,泛型类型 不确定,可以通过通配符 <?>
表示。
但是使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用,要使用需要强制转换。
应用场景
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用 ?
此时只能接受数据,不能往该集合中存储数据。
例子
//?代表可以接收任意类型
public static void test(List<?> list){
}
public static void main(String[] args) {
List<Intger> list1 = new ArrayList<>();
test(list1);
List<String> list2 = new ArrayList<>();
test(list2);
}
注意: 泛型 不存在继承关系 Collection<Object> list = new ArrayList<String>();
这种是错误的。
受限泛型
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的 上限 和 下限
应用场景
用在方法的形参上,限制泛型
泛型的上限
格式: 方法名 (类型名称 <? extends 类 > 形参名)
作用: 只能接收该类型及其子类
案例
要求:定义方法,形参是 List
类型,其泛型只能是基本数据类型的
分析:由于泛型 不能是基本数据类型,但可以用与之相对应的 包装类,由于包装类都继承 Number
类,所以加上 上限
// 指定泛型,该泛型必须是 Number的子类,如:Integer、Double等
public static void test(List<? extends Number> list){
}
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<Integer>();
test(list1);
List<Double> list2 = new ArrayList<Double>();
test(list2);
List<String> list3 = new ArrayList<String>();
// test(list3);//报错
List<Pet> list4 = new ArrayList<Pet>();
// test(list3);//报错
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
泛型的下限
格式: 方法名 (类型名称 <? super 类 > 形参名)
作用: 只能接收该类型及其父类型
案例
要求:定义方法,形参是 List
类型,其泛型只能是 Integer
的父类
public static void test(List<? super Integer> list){
}
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
test(list1);
List<Number> list2 = new ArrayList<>();
test(list2);
List<String> list3 = new ArrayList<>();
// test(list3);// 报错
List<Pet> list4 = new ArrayList<>();
// test(list4); // 报错
}