泛型中extends和super的区别
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的区别相关推荐
- 【Java】泛型中 extends 和 super 的区别?
<? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...
- Java泛型中extends和super的区别?
区别 <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概 ...
- java super extend 区别_Java泛型中extends和super的区别
extends T>和 super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. extends T&g ...
- java中super()_Java 泛型中 extends 和 super 的区别是什么?
<? extends T> 和 <? super T> 是 Java 泛型中的 "通配符(Wildcards)" 和 "边界(Bounds)&qu ...
- Java泛型中extends和super的理解(转)
E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定 ...
- Java泛型中extends T和super T的区别?
<? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...
- Java中this与super的区别
2019独角兽企业重金招聘Python工程师标准>>> this与super关键字在java中构造函数中的应用: ** super()函数 ** super()函数在子类构造函数 ...
- Object-C中self和super的区别
self与super的区别 原文CSDN evilotus 有所整理 **** 在ObjC中的类实现中经常看到这两个关键字"self"和"super",以以前o ...
- java中extends与implements的区别
JAVA中extends 与implements有啥区别? 1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. ...
最新文章
- oracle 内存分配和调优 总结
- python3.6安装opencv-python3.6.5安装opencv3
- 三步搭建Spring Cloud 服务注册
- .NET定时任务执行管理器开源组件–FluentScheduler
- qt5.6.3版本移植arm
- 飞机大战小游戏1.0版本
- 华为防火墙Edumon1000E配置
- freecplus框架-ftp客户端
- Centos7 搭建 hadoop3.1.1 集群教程
- 解决:mongod启动报错缺少libcrypto.so.1.1
- 斐讯K2刷华硕固件+全套工具
- 2009中国IT界名人
- IBM power小型机HMC管理口默认IP地址和ASMI默认密码
- 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)
- Andy’s First Dictionary(安迪的第一部词典)
- 使用JLink SEGGER_RTT_printf()函数实现打印浮点数
- 【区块链108将】区块链无权威,参与之前多了解才可能赚钱
- 如何在win7下装ubuntu(硬盘版安装)
- VS2015未定义标识符gets
- 在线代码编辑器:Codeanywhere介绍