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

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. cesium 入门指南

    最近拿到了几份offer,经过这次找工作发现自己最近脱节挺严重,为了后续的职业发展,决定开始书写博客记录自己的努力. cesium属于 跨平台.跨浏览器的展现三维地球.地图的JavaScript库. ...

  2. 龙中华著《Spring Boot实战派》读书笔记之入门篇

    第一章 进入Spring Boot的世界 理念:默认大于配置.有很多集成好的方案,开箱即用.针对痛点:环境配置耗时. 1.1 Spring Boot 的特色: 使用简单 注解方式实现类的定义和功能开发 ...

  3. android 下载安装包更新app

    1下载 public void download(String url) { Utils.Loge("download",url); Uri uri = Uri.parse(url ...

  4. FCC 中级算法题 Everything Be True

    Everything Be True 所有的东西都是真的! 完善编辑器中的every函数,如果集合(collection)中的所有对象都存在对应的属性(pre),并且属性(pre)对应的值为真.函数返 ...

  5. MPC

    Just for anyone searching for code. I found it here: https://drive.google.com/drive/folders/0BzLEHBD ...

  6. [C++] epoll server实例

    // IO多路复用,事件驱动+非阻塞,实现一个线程完成对多个fd的监控和响应,提升CPU利用率 // epoll优点: // 1.select需要每次调用select时拷贝fd,epoll_ctl拷贝 ...

  7. linux下文件重命名

    Ubuntu下执行上面举例的重命名时,命令是这样的:rename 's/a/xxx/g' *.txt

  8. ARMV8 short notes

    offset addressing pre-index addressing define like: load the compass content of the operand 2 to ope ...

  9. logrotate linux 系统日志管理

    logrotatelogrotate简介 logrorare一定程度上可以简化对会生成大量日志文件的系统的管理.logrotate可以实现自动轮替.删除.压缩和mail日志的功能. 执行命令logro ...

  10. 基于5G边缘网关的智慧公交站台应用

    发展智能物联网,有利于提高城市运行效率,优化居民生活体验,促进城市迸发活力.智能物联网已经融合进生活的方方面面,例如最常见.分布最广泛的公交站台,也能够通过物联网实现升级换代,为居民提供更丰富.更便捷 ...