JAVA 泛型 通配符? extends super限定,实例区分extends super限定的作用用法

java泛型中的关键字

  1. ? 表示通配符类型
  2. <? extends T> 既然是extends,就是表示泛型参数类型的上界,说明参数的类型应该是T或者T的子类。
  3. <? super T> 既然是super,表示的则是类型的下界,说明参数的类型应该是T类型的父类,一直到object。

实例代码看具体的区别

public class FanXing {
static class Fruit {
}

static class Apple extends Fruit {
}

static class Orange extends Apple {
}

public static void main(String... args) throws Exception {
List<? extends Fruit> list = new ArrayList<Orange>();
//无法安全添加不确定类型的元素
list.add(new Orange());
list.add(null);
Fruit fruit = list.get(0);

Orange orange = (Orange) list.get(0);

List<? super Fruit> list1 = new ArrayList<>();
list1.add(new Orange());
//无法确定具体的返回类型
Fruit fruit1 = list1.get(0);
Orange orange1 = (Orange) list1.get(0);
}
}

 来看一下代码编译器中两种不同的限定报错

 extends限定

List<? extends Fruit> 表示是一个Fruit类弄的或者Fruit子类的泛型
编译器无法确定List所持有的类型,所以无法安全的向其中添加对象。
但是可以添加null,因为null可以表示任何类型。
由于list里面的类型是从Fruit中继承过来的,所以可以安全取出Fruit类型 

 super限定

List<? super Fruit> 表示是一个Fruit类弄的或者Fruit父类的泛型
列表的类型至少是一个Fruit类型,因此可以安全的向其中添加Fruit及其子类型
由于list里面的类型是从Fruit的父类,编译器无法确定返回的类型,所以直接取值时会报错

小结

extends 可用于的返回类型限定,不能用于参数类型限定。
super 可用于参数类型限定,不能用于返回类型限定。
希望只取出,不插入,就使用? extends
希望只插入,不取出,就使用? super
希望,即能插入,又能取出,就不要用通配符?

转载于:https://www.cnblogs.com/songpingyi/p/10002018.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值