既然聊到了泛型的上下界问题,就先给出几个类的继承关系吧

class Fruit{}
class Apple extends Fruit{}
class Orange extends Fruit{}
class HongFuShi extends Apple{}
顶级父类Fruit下面有两个直接子类Apple和Orange,苹果Apple类的直接子类是HonGFuShi

先说下基础知识:我们知道List<Fruit>中是不能放Apple对象的,同时java是支持向上转型的,也就是父类的引用可以指向子类的对象->Fruit f = new Apple()

List<? extends Fruit> list 的上界就是Fruit,所以只可以存放Fruit本身和Fruit的子类对象 List<? extends Fruit> list= new ArrayList<Apple>()
因此<>里面可以是Apple也可以是Orange,当然也可以是Fruit。但是我们不能使用list.add(new Apple())或者list.add(new Fruit()),因为Fruit的子类有很多种类型,
存的时候不知道到底是那种类型,但是get的时候是没有问题的,因为get出来的都可以向上转型成Fruit。

List<? super Apple> list的下界就是Apple,所以只能存放Apple以及Apple的父类对象 List<? super Apple> list = new ArrayList<Fruit>()
因此<>里面只能是苹果类型或者苹果Apple的父类。所以存放的时候只能存放Apple(包括子类)类型,不能存放Apple的父类因为父类有好多种,但是子类和Apple都能确定是Apple类型。
list.add(new Apple()),list.add(new HongFuShi())都是可以的,但是list.add(new Fruit())不行
但是get的时候就需要注意了,可以使用Apple去承接,或者你知道具体哪个位置比如:list.get(0) 返回的是Apple类型。list.get(1)可以是Apple也可以是HonGFuShi类型。

关于Java中泛型的上界和下界理解的更多相关文章

  1. Java中泛型 类型擦除

    转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...

  2. Java中泛型使用

    Java中泛型使用 泛型作用: 泛型:集合类添加对象不用强转 反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码: ArrayList<Ls> ff=new ArrayList ...

  3. 关于Java中语句符号及格式的理解

    关于Java中语句符号及格式的理解 这篇文章是撰写的第一篇文章,在此作一下博主是一名在读的工科研究生,种种原因,研二开始决定转行从事程序员工作.开始的自学之路并不算非常顺畅,也走了一点弯路,但一直都坚 ...

  4. Java中关于static语句块的理解

    Java中关于static语句块的理解 一.static块会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法. 实例一 public class A{ String name ...

  5. Java中常用的设计模式代码与理解

    Java中常用的设计模式代码与理解 一.单例模式 1.饿汉式 (太饿了,类加载的时候就创建实例) /** * 饿汉式单例模式 */ public class HungrySingleInstance ...

  6. Java 中泛型的全面解析(转)

    Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在J ...

  7. Java中泛型区别以及泛型擦除详解

    一.引言 复习javac的编译过程中的解语法糖的时候看见了泛型擦除中的举例,网上的资料大多比较散各针对性不一,在此做出自己的一些详细且易懂的总结. 二.泛型简介 泛型是JDK 1.5的一项新特性,一种 ...

  8. Java中泛型的理解

    Java中的泛型,本质上来说,就是是参数化类型,就是说所操作的数据类型被指定为一个参数,而不是确定的某种类型.这种数据类型可以用在类.接口和方法创建中.即泛型类.泛型接口.泛型方法.这样说可能不够生动 ...

  9. Java中泛型在集合框架中的应用

    泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...

  10. Java中泛型数组创建总结

    在java中,可以声明一个泛型数组,不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Classtype,int size) ...

随机推荐

  1. CSS 语法-习惯代码书写风格

    代码风格是实际开发中的书写方式,并非强制标准. CSS 样式格式: 展开格式:开发过程使用,代码可读性强,便于调错. 紧凑格式:上传服务器时使用,减少不必要的空白字符,压缩文件大小,利于传输. 代码压 ...

  2. C语言II—作业03

    1.作业头 这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-3 这个作业要求在哪里 https://edu.cnblogs.com/cam ...

  3. Java中int型数据类型对应MySQL数据库中哪种类型?

    java类   mysql数据库 java.lang.Byte byte TINYINT java.lang.Short short SMALLINT java.lang.Integer intege ...

  4. redis启动报错(TCP backlog setting of 511/overcommit_memory is set to 0/THP)

    WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is s ...

  5. Manage your references to .Net assemblies Dynamics 365 for Operations VS projects

    (Dynamics 365 for Operations was previously known as the New Dynamics AX) Dynamics 365 for Operation ...

  6. VS中多字节字符集和UNICODE字符集的使用说明

    两者的核心区别: 1.在制作多国语言软件时,使用Unicode(UTF-16,16bits,两个字节).无特殊要求时,还是使用多字节字符集比较好. 2.如果要兼容C编程,只能使用多字节字符集.这里的兼 ...

  7. docker安装配置gitlab时的常用命令整理

    1.下载安装dockerapt install docker.io2.服务启动service docker start 3.拉取gitlabdocker pull beginor/gitlab-ce: ...

  8. SQL无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序规则冲突

    在所在的SQL语句后面加上 COLLATE [排序规则]或者ALTER DATABASE [DBName] COLLATE Chinese_PRC_CI_AS

  9. GPU Skinning

    这个工具的作用是同一种角色在同屏里面出现一大堆时,可以大幅度的降低DrawCall.我试了一下,感觉挺有意思的,各位可以试试.它的原理实际上是把骨骼矩阵存在配置文件里面,然后通过特殊的shader,计 ...

  10. egret 当前运行环境

    if(egret.Capabilities.runtimeType == egret.RuntimeType.WXGAME){}