目标
了解泛型用法中的通配符使用时extends与super的用法,了解选择上下限的用法
初始代码
import java.util.*;
public class GenericTest {
public static void main(String[] args) {
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>();
name.add("icon");
age.add(18);
number.add(314);
//getUperNumber(name);//1
getUperNumber(age);//2
getUperNumber(number);//3
}
public static void getData(List<?> data) {
System.out.println("data :" + data.get(0));
}
//限定了参数泛型上限为 Number
public static void getUperNumber(List<? extends Number> data) {
System.out.println("data :" + data.get(0));
}
}
代码变化
//限定了参数泛型下限为 Number
public static void getSuperNumber(List<? super Number> data) {
System.out.println("data :" + data.get(0));
}
//main使用时
List<Object> keep = new ArrayList<Object>();
keep.add("test");
//getUperNumber(name); //报错,Number为上限 泛型为 String 不在这个范围之内
//getUperNumber(keep); //报错,Number为上限 泛型为 Object不在这个范围之内
getSuperNumber(keep); //正确,Number为下限 泛型为 Object在这个范围之内
//getSuperNumber(name); //报错,Number为下限 泛型为 String 不在这个范围之内
分析
1.该问题主要问题集中在上下限问题
2.Java定义中 ,所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
3.string 不在 Number 的描述范围内,既不是上限范围,也不是下限范围,故extends与super存在局限性,需要注意
4.对应的图标为:
参考链接:
泛型用法:https://www.runoob.com/java/java-generics.html
Number用法:https://www.runoob.com/java/java-number.html