// 泛型出现之前集合的定义方式
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());
}
}