extends

泛型中extends的主要作用是设定类型通配符的上限
要理解这句话,我们先从一个例子来看:

class Fruit{public void call() {System.out.println("这是一个水果");}
}class Banana extends Fruit{@Overridepublic void call() {System.out.println("这是一个香蕉");}
}class Apple extends Fruit{@Overridepublic void call() {System.out.println("这是一个苹果");}
}public class Test{public void test1(List<Fruit> fruits) {for (Fruit fruit: fruits) {fruit.call();}}public static void main(String[] args) {List<Apple> apples = new ArrayList<>();List<Fruit> fruits = apples;     //类型转换失败Test test = new Test();test.test1(fruits);    //失败   }}

我们使用Apple继承了Fruit类,然后建立了两个list,一个容纳的是apple,一个容纳的是fruit。按照常理来说,因为Apple继承了Fruit,List<Apple>应该也是List<Fruit>的子类型。但是实际上不是这样的,运行上述程序,会报一个如下所示的错误。

Error:(42, 20) java: 不兼容的类型: java.util.List<com.company.Apple>无法转换为java.util.List<com.company.Fruit>

我们可以这样理解,如果上述代码能够正常运行,那把call方法修改成添加一个Banana对象会怎么样,因为test1方法中实际上使用的是List<Apple>,是不能够添加到Banana的,就会出错。所以List<Apple>不是List<Fruit>的子类型。

那我们如何处理类似的情况呢,这就需要使用extends了。

public class Test{public void test1(List<? extends Fruit> fruits) {for (Fruit fruit: fruits) {fruit.call();}}public static void main(String[] args) {List<Apple> apples = new ArrayList<>();Test test = new Test();test.test1(apples);}}

<? extends Fruit>代表的是上界通配符,也就是说这个List中存放的对象都是Fruit以及其子类的对象,这样我们就不用因为输入的List中类型的不同而改变代码了。
上界通配符有一个特点,就是程序只知道List<? extends Fruit>中的对象是Fruit的子类的对象,但是如果Fruit的子类有很多个,那个在使用add方法的时候,就可能出现本来是List<Apple>,然后在其中添加了banana对象,从而失败。

super

super与extends是完全相反的,其定义的是下界通配符。
List<? super Fruit>也就是说List中存放的都是Fruit和它的父类的对象,比如food,Object。而且如果要在这个List中取出数据,那就不能够确定具体是Fruit的哪个父类的对象,可能是Food,可能是Object。为了保证一定能够取出来,就必须把其转型成Object对象,但是这个时候就会失去原有对象的类型信息。所以List<? super Fruit>不能够提取数据。

泛型中extends和super的区别相关推荐

  1. 【Java】泛型中 extends 和 super 的区别?

    <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...

  2. Java泛型中extends和super的区别?

    区别 <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概 ...

  3. java super extend 区别_Java泛型中extends和super的区别

    extends T>和 super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. extends T&g ...

  4. java中super()_Java 泛型中 extends 和 super 的区别是什么?

    <? extends T> 和 <? super T> 是 Java 泛型中的 "通配符(Wildcards)" 和 "边界(Bounds)&qu ...

  5. Java泛型中extends和super的理解(转)

    E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定 ...

  6. Java泛型中extends T和super T的区别?

    <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...

  7. Java中this与super的区别

    2019独角兽企业重金招聘Python工程师标准>>> this与super关键字在java中构造函数中的应用:  ** super()函数 **  super()函数在子类构造函数 ...

  8. Object-C中self和super的区别

    self与super的区别 原文CSDN evilotus 有所整理 **** 在ObjC中的类实现中经常看到这两个关键字"self"和"super",以以前o ...

  9. java中extends与implements的区别

    JAVA中extends 与implements有啥区别?  1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.    ...

最新文章

  1. oracle 内存分配和调优 总结
  2. python3.6安装opencv-python3.6.5安装opencv3
  3. 三步搭建Spring Cloud 服务注册
  4. .NET定时任务执行管理器开源组件–FluentScheduler
  5. qt5.6.3版本移植arm
  6. 飞机大战小游戏1.0版本
  7. 华为防火墙Edumon1000E配置
  8. freecplus框架-ftp客户端
  9. Centos7 搭建 hadoop3.1.1 集群教程
  10. 解决:mongod启动报错缺少libcrypto.so.1.1
  11. 斐讯K2刷华硕固件+全套工具
  12. 2009中国IT界名人
  13. IBM power小型机HMC管理口默认IP地址和ASMI默认密码
  14. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)
  15. Andy’s First Dictionary(安迪的第一部词典)
  16. 使用JLink SEGGER_RTT_printf()函数实现打印浮点数
  17. 【区块链108将】区块链无权威,参与之前多了解才可能赚钱
  18. 如何在win7下装ubuntu(硬盘版安装)
  19. VS2015未定义标识符gets
  20. 在线代码编辑器:Codeanywhere介绍

热门文章

  1. 未来 Android 开发的从业方向
  2. Android系统根目录下的各个文件夹的作用与区别介绍
  3. 「C#」异步编程玩法笔记-WinForm中的常见问题
  4. ZK指纹机二次开发中控F18
  5. MCS-51单片机C语言程序注释,精通MCS-51单片机C语言编程
  6. 二分查找-允许重复数字
  7. 雨课堂刷视频Python脚本
  8. 太乐地图下载器5.0.5(破解版)
  9. pygame-KidsCanCode系列jumpy-part13-改进跳跃
  10. 迁移TFS,批量将文档导入SharePoint 2013 文档库