一.泛型通配符
<? extends T>和<? super T> 是 Java 泛型中的"通配符"和"边界"的概念。
<? extends T>:是指 “上界通配符 意思是可以接受子类的集合 只能取不能插入
<? super T>:是指 “下界通配符 意思是可以接受父类的集合 只能插入不能取
使用 extends 和 super 的目的是:是使容器之间具有继承关系的
public class Main {
public static void main(String[] args){
ArrayList<Foot> foots=new ArrayList<>();
ArrayList<Fruit> fruits=new ArrayList<>();
ArrayList<Apple> apples=new ArrayList<>();
ArrayList<Banana> bananas=new ArrayList<>();
foots.add(new Foot("煎饼"));
fruits.add(new Fruit("水果"));
apples.add(new Apple("红苹果"));
bananas.add(new Banana("黄香蕉"));
putExtends(fruits);
putSuper(foots);
}
//上界通配符 只能取 不能插入
//只有是 fruit 的集合或Fruit 子类的集合才可以赋值给 ArrayList<? extends Fruit> fruits
//所以 ArrayList<? extends Fruit> fruits中每一个元素都是 可以转换成 Fruit 的所以只能取
//存的话:因为ArrayList<? extends Fruit> fruits有可能是 ArrayList<Apple>集合 也有可能是 ArrayList<Banana>集合
//无法确定是哪个集合,所以不能存放元素,不知道在ArrayList<? extends Fruit> fruits中是存 Apple 好还是 Banana 好,
//就和子类都可以转换成父类,但是父类不可以转换成子类是一个意思
public static void putExtends(ArrayList<? extends Fruit> fruits){
System.out.println(fruits.get(0).getName());//
}
//上界通配符 只能插入 不能取
//只有 Fruit 的集合和 Fruit 父类的集合才可以赋值给ArrayList<? super Fruit> fruits
//所以ArrayList<? super Fruit> fruits 代表的都是 Fruit 父类的集合,子类的集合当然可以转换成父类的集合所以只能存
//对于取得话,因为ArrayList<? super Fruit> fruits代表的是 Fruit集合以及Fruit 父类的集合,所以父类的集合有可能是
//ArrayList<Foot> 集合,也有可能是 ArrayList<Object>集合,所以取出的元素只能是 Object,所以不能取
public static void putSuper(ArrayList<? super Fruit> fruits){
fruits.add(new Fruit("水果2"));
System.out.println(fruits);
}
}