通配符:?
-
?可以在 "使用泛型" 的时候代表一切类型。
-
E T K V 是在定义泛型的时候使用的。
接下来直接上案例
需求:实现任意数值型数据的处理,比如对List<Number>,List<Integer>这些数值进行求和,方法如何设计呢?
import java.util.*;
public class MainTest {
/**
* 错误的实现方案一:
* @param list 此处参数只能接收 Number类型的
*/
public static void test01(List<Number> list){ // 只能接收Number类型的集合
}
public static <T extends Number> void test02(List<T> list){ // 可以满足要求,但是有更简单的写法
}
public static void test03(List<? extends Number> list){ // 最简单的写法
double sum = 0;
for (Number number : list) {
sum+=number.doubleValue();
}
System.out.println(sum);
}
public static void main(String[] args) {
ArrayList<Double> doublelist = new ArrayList<>();
ArrayList<Float> floatlist = new ArrayList<>();
ArrayList<Integer> integerlist = new ArrayList<>();
// java: 不兼容的类型: java.util.ArrayList<java.lang.Double>无法转换为java.util.List<java.lang.Number>
// test01(doublelist);
System.out.println("------------------------------");
// test02(doublelist);
// test02(floatlist);
// test02(integerlist);
System.out.println("------------------------------");
test03(doublelist);
test03(floatlist);
test03(integerlist);
}
}
总结:
- ?extend Number 说明:此处只能是 Number 的子类或者Number类 (Float,Double,Integer)
- ?super Number 说明:此处只能是 Number 的父类或者Number类(Object)