最近在看 on java 这本书,看到 泛型的时候就有一点止步不前, 特别是
? extends? super这种泛型限制符号,不像 泛型类和泛型方法那样更确切的含义,多花了一点时间,但是泛型如此的重要,因此弄明白很重要
public class TestGenerics {
public static void main(String[] args) {
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
List<Pig> pigs = new ArrayList<>();
pigs.add(new Pig());
List<? extends Animal> list1 = pigs;
list1 = dogs;
// list1.add(new Pig());
Animal animal1 = (Animal)new Dog();
Animal animal2 = (Animal)new Pig();
System.out.println(animal1);
System.out.println(animal2);
/**
* list1 可以指定为 dogs集合 也可以指定为 pigs集合 因为这两集合都是 Animal的 子类
* 假设按照 ? extends Animal 的规则添加 猪对象,但是我最后一个赋值是dogs集合 ,里面只能存储dog对象
* 猪对象不能等于狗对象,所以存储不了,刚才一个机灵,又想到了一个东西就是 如果在存储的时候 将 Pig 和 Dog
* 向上转型 转为Animal 对象不就行了吗,当然不行,因为虽然向上转型了,但是 Pig 还是猪 ,Dog还是狗
* 可以通过toString来区分,在取数据的时候,至少是Animal,所以取出来的就是 Animal
*/
List<Organism> organisms = new ArrayList<>();
organisms.add(new Organism());
List<Molecule> molecules = new ArrayList<>();
molecules.add(new Molecule());
List<? super Animal> list2 = molecules;
list2.add(new Dog());
list2 = organisms;
list2.add(new Pig());
/**
* list2 可以指定为 organism集合 也可以指定为 molecule集合 因为这两集合都是 Animal的 父类
* 如果 list2 = molecules,然后在添加了一个狗对象,Dog 也是 Molecule 没有毛病
* 如果 list2 = organisms,然后在添加了一个猪对象,Pig 也是 Organism 没有毛病
* 但是 取的时候,不能保证 是 molecule 或者是 organism,所以就是 顶级 父类 Object
*/
}
}
class Molecule {
@Override
public String toString() {
return "Molecule";
}
}
class Organism extends Molecule {
@Override
public String toString() {
return "Organism";
}
}
class Animal extends Organism {
@Override
public String toString() {
return "Animal";
}
}
class Dog extends Animal {
@Override
public String toString() {
return "Dog";
}
}
class Pig extends Animal {
@Override
public String toString() {
return "Pig";
}
}