? extends E; ? super E

   ? extends E: 可以接收E类型或者E的子类型。上限。
        ? super E: 可以接收E类型或者E的父类型。下限

    

<? extends Class>是一种限制通配符类型,它可以接受所有<Class>以及Class的子类型。然而调用代价是,只读访问
  1. List<? super Fruit> list = new ArrayList<Apple>();
  2. list.add(new Apple());//可以
  3. list.add(new Fruit());//可以
  4. List<? extends Fruit> list = new ArrayList<Apple>();
  5. list中为什么不能加入Fruit类和Fruit类的子类呢,原因是这样的
  6. List<? extends Fruit>表示上限是Fruit,下面这样的赋值都是合法的
  7. List<? extends Fruit> list1 = new ArrayList<Fruit>();
  8. List<? extends Fruit> list2 = new ArrayList<Apple>();
  9. List<? extends Fruit> list3 = new ArrayList<Jonathan>();
  10. 如果List<? extends Fruit>支持add方法的方法合法的话
  11. list1可以add Fruit和所有Fruit的子类
  12. list2可以add Apple和所有Apple的子类
  13. list3可以add Jonathan和所有Jonathan的子类
  14. 这样的话,问题就出现了
  15. List<? extends Fruit>所应该持有的对象是Fruit的子类,而且具体是哪一个
  16. 子类还是个未知数,所以加入任何Fruit的子类都会有问题,因为如果add Apple
  17. 的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan>()
  18. Apple的加入肯定是不行的,如果 如果add Jonathan
  19. 的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan的子类>()
  20. Jonathan的加入又不合法,所以List<? extends Fruit> list 不能进行add
  21. 而List<? super Fruit> list 表示list持有的对象是Fruit的父类,下限是  Fruit,所以list中add Fruit或Fruit的子类是没有问题的
时间: 2024-11-05 14:44:57

? extends E; ? super E的相关文章

&lt;? extends T&gt;和&lt;? super T&gt;

转自:Java泛型中extends和super的区别? 另,问题来源:Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. <? extends T>:是指 "上界通配符(Upper Bounds Wildcards)"

Java泛型的定义以及对于&lt;? extends T&gt;和&lt;? super T&gt;

Java 中对于泛型方法的定义: public <T> T getT(){ .....相关代码; } 其中我对<T>的理解就是申明只是一个泛型方法的标记,T是返回的类型. 对于泛型类的定义: public class Type<T>{ ....相关代码 } 上面写的是关于泛型方法和泛型类的定义.这里写这篇博客的主要目的是为了记录<? extends T> 和 <? super T>的理解. <? extends T>是上界通配符.逻辑

继承?静态代理?写一个自己的动态代理吧

[ 需求分析 ] 在我们实际开发中常常会遇到这样的问题:记录一个类的方法运行时间,以分析性能.一般我们的做法是先在类的开始记录一个开始时间,然后在类的结束记录一个结束时间,二者相减就可以获取我们想要的结果.但是很多时候这些类已经打了jar包,我们无法直接修改源码,这个时候我们应该怎么办呢? 下文使用Tank的移动需要统计时间.记录日志来模拟需求场景,假定Moveable.Tank类无法修改. interface:Moveable public interface Moveable { publi

Java学习之道:简述泛型通配符&lt;? extends T&gt;和&lt;? super T&gt;

<? extends T>和<? super T>含有JAVA5.0的新的概念.由于它们的外表导致了很多人误解了它们的用途: 1.<? extends T>首先你很容易误解它为继承于T的所有类的集合,这是大错特错的,相信能看下去你一定见过或用过List<? extends T>吧?为什么我说理解成一个集合是错呢?如果理解成一个集合那为什么不用List<T>来表示?所以<? extends T>不是一个集合,而是T的某一种子类的意思,记

一文搞懂List 、List&lt;Object&gt;、List&lt;?&gt;的区别以及&lt;? extends T&gt;与&lt;? super T&gt;的区别

前段时间看<Java编程思想>泛型时对 <? extends T>与<? super T>很懵逼,接着看到泛型与集合的更蒙蔽,随后又翻开<码出高效>时,对这些知识点才恍然大悟,发篇博客记录下 List.List<Object>.List<?> 的三者的区别以及 <? extends T>与<? super T> 的区别 List.List<Object>.List<?> List :完全

为猿七年有余,痒否?痛否?

还未有感,已然岁末,犹叹时之箭逝去如斯也,稍纵命再减一.回首望,为猿七年有余已,虽不成气候,亦未全蹉跎.略做小结,以不惘逝去之时日,亦会大益于尔后路途.若博文能助足下之一二,孤将甚悦. 职业是无数个连接起来的马拉松 小学时,我们很清楚的知道5年后就毕业了(孤当年是五四制,现在貌似有的地方也是),无论多么讨厌老师或者 同学,或者学校,都知道最多忍5年就结束了:初中高中也一样,三四年样子,很快就过去了,多少欢乐悲喜都会很快的过去:大学更是如此,从入学进校园那天起你就开始倒计时,知道四年后的一天要离开

C#中??操作符和?操作符

C#中??和?操作符如何使用及意思: 为了实现Nullable数据到non-Nullable型数据的转换 ??操作符意思是取所复制??左边的,如果左边的为null,取所赋??右边的 ?是system.Nullable的缩写形式,int?代表可空的整型        例如:int? a = 1 或者 int? b=null.Nullable类型具有一个HasValue的bool类型只读属性,当Nullable类型实例的该属性为true时,则表示该实例是非空实例,包含一个已知值Value, HasV

长这么漂亮为啥还学编程?什么心态?

妹子,你事业线都有了,还学什么编程!什么心态啊? (ps:曾红极一时的“代码女神”) 高中时候给我补习数学的老师委婉的跟我爸爸说: “孩子这个……逻辑思维啊……不是说笨啊……就是这方面思维,不太强……听说过安利吗?我老婆代理这个螺旋藻专门补脑的……” 虽然之后我们家都默认了我智商有问题,可最终还是没吃那东西. 大学第一节汇编课,老师发现我脑子转的很快,所以整个一节课都面向我讲,等着看我的眼神,听我第一个答出他的问题. 下课之后他来跟我说: “我发现你逻辑思维很强的,真聪明啊!” 什么心态?就是一

MB/GB/TB/PB/EB/ZB/YB/NB/DB/CB存储空间都是多大?如何换算?

yte是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制.目前我们常用计算存储空间的最小单位(其实还有更小的bit,1 Byte=8 bit). 不过从硬盘或者叫做存储空间来说,我们用到的最小单位是KB(Kilobyte),大小为2的10次方字节,与Byte换算是:1KB=1024Byte 以后的换算基本都是以2的10次方来递增的. 1KiB(Kilobyte)=1024B ,即2的10次方字节,读音“千字节”1MiB(Megabyte)=1024KiB,即2的20