为何子类泛型List无法赋值给父类泛型List?

更多讨论请看:
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的子类,为什么不能向上转型呢?
首先先说明一点:DogAnimal的子类,但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()方法。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值