Java 泛型

本文详细介绍了Java中泛型类和泛型方法的概念,并重点讲解了通配符`<? extends T>`和`<? super T>`的用法。`<? extends T>`限制了参数为T或其子类,适用于读取操作;`<? super T>`则限制为T或其超类,适合写入操作。通过实例展示了它们在继承关系中的行为差异,帮助开发者更好地理解和运用Java泛型。

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

泛型类和泛型方法

首先看下Java的正常的泛型的类和泛型方法的写法:

/**
 * 泛型类
 */
class Generic<T> {
    private T data;

    /**
     * 返回值是泛型的普通方法
     */
    public T getData() {
        return data;
    }

    /**
     * 参数是泛型的普通方法
     */
    public void setData(T data) {
        this.data = data;
    }

    /**
     * 泛型方法
     */
    private <E> E getData(E data) {
        return data;
    }
}

由上面的例子可以看出:

  1. 在类的后面加<T> 就可以是泛型类。
  2. 只有在方法的返回值前加<T>才算泛型方法。
  3. 泛型类里面的泛型方法的声明完全无关。
通配符

在验证限定符之前我们先创建几个有继承关系的类,来方便测试:

public class Food {

    public static class Fruit extends Food{}

    public static class Apple extends Fruit{}
}
1. <? extends T>

testExtendsGeneric

  • 从代码中可以看出类型是FruitApple时都没问题,但是在传入Food时候编译报错。
  • add的时候也会报错。
  • get的时候没问题,但是只能返回Fruit类型。
2. <? super T>

testSuperGeneric
从上面的例子可以看出,

  • 泛型类型只可以传入Fruit以及它的超类。
  • add()方法中只可以写入Fruit以及它的子类,因为可以向上转型。
  • get()方法只能获取一个object对象,因为object是所有类的超类,确定不了是哪个类只能是object
总结
  • <? extends T> 只能设置T以及它的子类,决定了参数的上限。可以安全访问数据,只能获取T类型数据。
  • <? super T> 只能设置T以及它的超类,决定了参数的下限。可以安全写入数据,只能写入T或者T的子类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值