600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > java 泛型中的上界(extend)和下界(super)

java 泛型中的上界(extend)和下界(super)

时间:2022-07-24 03:13:26

相关推荐

java 泛型中的上界(extend)和下界(super)

1. 泛型中上界和下界的定义

上界 <? extends Fruit>

下界 <? super Apple>

2.上界和下界的特点

上界的list只能get,不能add(确切地说不能add出除null之外的对象,包括Object)

下界的list只能add,不能get

import java.util.ArrayList;import java.util.List;class Fruit {}class Apple extends Fruit {}class Jonathan extends Apple {}class Orange extends Fruit {}public class CovariantArrays {public static void main(String[] args) {//上界List<? extends Fruit> flistTop = new ArrayList<Apple>();flistTop.add(null);//add Fruit对象会报错//flist.add(new Fruit());Fruit fruit1 = flistTop.get(0);//下界List<? super Apple> flistBottem = new ArrayList<Apple>();flistBottem.add(new Apple());flistBottem.add(new Jonathan());//get Apple对象会报错//Apple apple = flistBottem.get(0);}}

3.这些特点的原因

上界 <? extends Fruit> ,表示所有继承Fruit的子类,但是具体是哪个子类,无法确定,所以调用add的时候,要add什么类型,谁也不知道。但是get的时候,不管是什么子类,不管追溯多少辈,肯定有个父类是Fruit,所以,我都可以用最大的父类Fruit接着,也就是把所有的子类向上转型为Fruit。

下界 <? super Apple>,表示Apple的所有父类,包括Fruit,一直可以追溯到老祖宗Object 。那么当我add的时候,我不能add Apple的父类,因为不能确定List里面存放的到底是哪个父类。但是我可以add Apple及其子类。因为不管我的子类是什么类型,它都可以向上转型为Apple及其所有的父类甚至转型为Object 。但是当我get的时候,Apple的父类这么多,我用什么接着呢,除了Object,其他的都接不住。

所以,归根结底可以用一句话表示,那就是编译器可以支持向上转型,但不支持向下转型。具体来讲,我可以把Apple对象赋值给Fruit的引用,但是如果把Fruit对象赋值给Apple的引用就必须得用cast。

4.用在什么地方

具体用在什么地方,欢迎评论里讨论

————————————————

版权声明:本文为CSDN博主「yangguanghaozi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:/yangguanghaozi/article/details/54632477

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。