更多讨论请看:
Java泛型其实很简单(二):泛型,继承,子类型
先来看代码:
public class GenericTest {
public static void main(String[] args) {
List<Dog> dogs = new ArrayList<>();
List<Animal> animals = new ArrayList<>();
animals = dogs; //complie error
}
}
class Animal {
}
class Dog extends Animal {
}
class Cat extends Animal {
}
在animals = dogs的时候,编译器就会报错。明明Dog就是Animal的子类,为什么不能向上转型呢?
首先先说明一点:Dog是Animal的子类,但List<Dog>并不是List<Animal>的子类。
我们假设animals = dogs成功通过编译,那么接下来我们:
animals.add(new Cat());
Dog dog = animals.get(0);
我们get(0)出来的类型将会是Cat!这种不安全的现象不应该发生,所以animals = dogs无法通过编译。
额外多说一点:
public class GenericTest {
public static void main(String[] args) {
List<Dog> dogs = new ArrayList<>();
List<? exntends Animal> animalsCopy = new ArrayList<>();
animalsCopy = dogs; //complie pass
}
}
将List<Animal> animals = new ArrayList<>();改为List<? exntends Animal> animalsCopy = new ArrayList<>();就可以通过编译。因为animalsCopy不允许调用add()方法,这样子就保证了不会有add(new Cat())这种情况发生。
为什么animalsCopy不允许调用add()方法呢?因为List<? exntends Animal> animalsCopy虽然可以加入任意一种Animal的子类,但是,?只能代表一种子类,但是编译器无法确定加进去的到底是哪一种,因此无法调用addd()方法。
1万+

被折叠的 条评论
为什么被折叠?



