当前位置: 代码迷 >> 综合 >> List通配符 相关知识
  详细解决方案

List通配符 相关知识

热度:34   发布时间:2023-10-08 18:35:41.0
        // 泛型出现之前集合的定义方式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和clearList<?> 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());}
}

 

  相关解决方案