List通配符 相关知识

        // 泛型出现之前集合的定义方式
        List a1 = new ArrayList();
        a1.add(new Object());
        a1.add(new Integer(11));


        // 把a1引用赋值给a2,注意  a2泛型限制了 <Object>
        List<Object> a2 = a1;
        a2.add(new String("1234"));

        List<Integer> a3 = a1;
        // a3.add(new String("12")); 编译报错,限定了String类型


        // ? 称为通配符集合,它可以接收任何类型的集合引用赋值,不能添加任何元素,但可以remove和clear
        List<?> a4 = a1;
        a4.remove(0);
        a4.clear();
        System.out.println(Arrays.toString(a4.toArray()));

        /*
        *  List<T> 最大的问题只能放置一种类型
        *
        * 如果需要放置多种受泛型约束的类型呢?
        *
         *    <? extends T> 可以赋值给任何T及T子类的集合,上界为T,取出的类型带有泛型限制,向上强制转型为T
        *
        *     <? super T> 可以赋值给任何 T 以及 T类型的父类集合,下界为 T.
        *
        * */
​​​​​​​
class Animal {
}

class Cat extends Animal {

}

class GarCat extends Cat {

}


class AnimalCat {

    public static void main(String[] args) {
        List<Animal> animals = new ArrayList<>();
        List<Cat> Cats = new ArrayList<>();
        List<GarCat> garCats = new ArrayList<>();

        // 编译出错, 只能赋值Cat和Cat子类
        // List<? extends Cat> extendsCatFromAnimal = animals;

        // 只能赋值Cat或Cat父类的集合
        // List<? super Cats> superCat = garCats;

        // 本类和子类
        List<? extends Cat> extendsFromCat = Cats;

        extendsFromCat.get(0);

        /**
         *   所有 <? extends Cat> 除了null之外, 都无法进行add操作,
         *   extendsFromCat.add(new Animal());
             extendsFromCat.add(new Cat());
             extendsFromCat.add(new GarCat());
         */

        List<? super Cat> superList = animals;

        // List<? super Cat> 可以往里面增加元素,但是只能添加Cat自身以及子类对象
        superList.add(new GarCat());
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值