Java基础: 泛型 <? super T> 中 super与extends的理解

本文详细解释了Java泛型中上界和下界的使用,通过通配符<? super T>和<? extends T>的实例分析了它们的区别和应用场景。上界<? extends T>适用于读取操作,下界<? super T>适用于写入操作,遵循PECS原则。同时,文章讨论了通配符带来的副作用,如限制了某些方法的使用。

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

文章结合知乎大佬的回答,结合自己的理解进行整理.但内容属于该作者. 原文链接: 点击跳转

<? extends T><? super T> 是Java泛型中的通配符边界的概念.

<? extends T> : 是指 上界通配符
<? super T> : 是指 下届通配符

1. 为什么要用通配符和边界?

使用泛型的过程中,经常出现一种很别扭的情况.比如我们有Fruit类,和它的派生类Apple类.

class Fruit {
    } 
class Apple extends Fruit {
    }

然后有一个最简单的容器: Plate类,盘子里可以放一个泛型的"东西".我们可以对这个东西做最简单的"放"和"取"的动作: set() 和 get() 方法.

class Plate<T> {
   

    private T item;

    public Plate(T t) {
   
        item = t;
    }

    public void set(T t) {
   
        item = t;
    }

    public T get() {
   
        return item;
    }
}

现定义一个"水果盘子",逻辑上水果盘子当然可以装苹果.

Plate<Fruit> p = new Plate<>(new Apple());

但实际上Java编译器不允许这个操作.会报错,“装苹果的盘子"无法转化为"装水果的盘子”.

这个不符合正常的逻辑呀.

但编译器认定的逻辑是这样的:

苹果 IS-A

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值