<? extends T>与<? super T>的区别

本文详细解析了Java泛型中的<?extendsT>和<?superT>的使用场景及限制,通过具体代码示例展示了泛型在提取元素和存放元素时的不同行为,帮助读者深入理解泛型的高级用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<? extends T>:

<? extends T>是get优先,put受限,适用于提取元素为主的场景。

<? extends T>可以赋值给任何T以及T的子类的集合,上界为T,取出的类型带有泛型限制,向上转型为T,除了null以外,任何元素不得添加进<? extends T>集合内。

<? super T>:

<? super T>是put优先,get受限,适用于存放元素为主的场景。

<? super T>可以赋值给任何T以及T的父类集合,下界为T,取出的类型会泛型丢失,添加时只能添加T或T的子类。

例子:

public class AnimalCatGarfield {
    public static void main(String[] args) {
        // 第一段:声明三个依次继承的集合:Animal > Cat > Garfield
        List<Animal> animals = new ArrayList<>();
        List<Cat> cats = new ArrayList<>();
        List<Garfield> garfields = new ArrayList<>();
        animals.add(new Animal());
        cats.add(new Cat());
        garfields.add(new Garfield());

        // 第二段:测试赋值操作
        // 下行编译报错,只能赋值Cat或Cat的子类
        List<? extends Cat> extendsCatsFromAnimal = animals;
        List<? extends Cat> extendsCatsFromCat = cats;
        List<? extends Cat> extendsCatsFromGarfield = garfields;

        List<? super Cat> superCatsFromAnimal = animals;
        List<? super Cat> superCatsFromCat = cats;
        // 该行编译报错,只能赋值Cat或Cat的父类
        List<? super Cat> superCatsFromGarfield = garfields;

        // 第三段:测试add方法
        // <? extends T> 添加受限,除了add(null)其它都编译报错
        extendsCatsFromCat.add(new Animal());
        extendsCatsFromCat.add(new Cat());
        extendsCatsFromCat.add(new Garfield());
        extendsCatsFromCat.add(null);

        // 下行编译报错,只能添加Cat或Cat的子类
        superCatsFromCat.add(new Animal());
        superCatsFromCat.add(new Cat());
        superCatsFromCat.add(new Garfield());

        // 第四段:测试get方法
        Cat cat = extendsCatsFromCat.get(0);
        // 下行编译报错,取出的类型带有泛型限制,都向上转型为Cat
        Garfield garfield = extendsCatsFromGarfield.get(0);
        // 所有super的泛型都能取出数据,但是会泛型丢失,只能返回Object类型元素
        Object object = superCatsFromCat.get(0);
    }
}
class Animal{}
class Cat extends Animal{}
class Garfield extends Cat{}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@从入门到入土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值