java泛型<? extends E>和<? super E>的区别和适用场景

本文详细解释了Java泛型中<? extends E>和<? super E>的区别,包括它们在写入和读取操作上的行为。<? extends E>用于限制元素类型的上限,确保集合中元素是E或其子类;<? super E>限制元素的下限,确保元素是E或其父类。此外,文章还探讨了这两种通配符在不同场景下的适用性,如子类型限定和超类型限定,并通过实例说明了它们在方法参数和返回值中的使用情况。
摘要由CSDN通过智能技术生成

<? extends E>是Upper Bound(上限)的通配符,用来限制元素类型的上限,如:

List<? extends Fruit> fruits;

表示集合中的元素的上限是Fruit类型,即只能是Fruit或者Fruit的子类,如:

fruits = new ArrayList<Fruits>();

fruits = new ArrayList<Apple>();

都是合理的,但是如果是Fruit的父类就会报错,如:

fruits = new  ArrayList<Object>();

编译会报错。

1.写入

fruits.add(new Apple());报错

因为集合fruits中装的元素类型为Fruit或Fruit子类,直觉告诉我们,往fruits中添加一个Fruit类型对象或其子类对象是可行的,结果是编译都不通过,为什么?因为<? extends Fruit>只是告诉编译器集合中元素的类型上限,但它具体是什么类型编译器是不知道的,fruits可以指向ArrayList<Fruit>,也可以指向ArrayList<Apple>、ArrayList<Banana>,也就是说它的类型是不确定的,既然是不确定的,为了类型安全,编译器只能阻止添加元素了。举个例子,当你添加一个Apple时,但fruits此时指向ArrayList<Banana>,显然类型就不兼容了。当然null除外,因为它可以表示任何类型

2.读取

Fruit fruit = fruits.get(0);

无论fruits指向什么,编译器都可以确定获取的元素是Fruit类型,所有读取集合中的元素是允许的


<? super E>是 Lower Bound(下限) 的通配符 ,用来限制元素的类型下限,比如

List<? super Apple> apples;

表示集合中元素类型下限为Apple类型,即只能是Apple或Apple的父类,因此对于下面的赋值是合理的

apples = new ArrayList<Apple>();  

如果元素是apple的子类,则编译不通过

apple = new ArrayList<RedApple>();报错

1.写入

因为apples中装的元素是Apple或Apple的某个父类,我们无法确定是哪个具体类型,但是可以确定的是Apple和Apple的子类是和这个“不确定的类”兼容的,因为它肯定是这个“不确定类型”的子类,也就是说我们可以往集合中添加Apple或者Apple子类的对象,所以对于下面的添加是允许的

apples.add(new Apple()); 

 apples.add(

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值