再论<? extends T>和<? super T>
参考:
https://www.cnblogs.com/drizzlewithwind/p/6100164.html
Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? - 胖君的回答 - 知乎
https://www.zhihu.com/question/20400700/answer/117464182
说得很清楚,但是有一处没说明白(知乎上有人提出来了):
使用<? super Fruit>时,子类类型也接受:
Plate<? super Fruit> p2 = new Plate<>(new Fruit());
p2 = new Plate<>(new Food());
p2 = new Plate<>(new Fruit());
p2 = new Plate<>(new Apple()); // 这是个子类型
新写一版,不引入Plate类,直接用JAVA自己的ArrayList类来做测试。
public interface List<E> extends Collection<E> {
...
boolean add(E e);
...
E get(int index);
....
}
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable{...}
定义三个类,Fruit->Apple->RedApple,声明ArrayList,有如下现象:
import java.util.*;
public class 泛型_通配符边界2 {
public static void main(String[] args) {
ArrayList<Apple> p1 = new ArrayList<Apple>();
// 【震惊!装得了苹果,装不了红苹果】
// ↓Type mismatch:
// cannot convert from ArrayList<RedApple> to ArrayList<Apple>
// ArrayList<Apple> p2 = new ArrayList<RedApple>();
}
}
class Fruit {
}
class Apple extends Fruit {
}
class RedApple extends Apple {
}
解决方案就是
【1.<? extends Fruit>,定类型继承关系的上界】
【2.<? super Apple>,确定类型继承关系的下界】
解决方案如下,照着注释看便是
package ah;
import java.util.*;
public class 泛型_通配符边界2 {
public static void main(String[] args) {
ArrayList<Apple> p1 = new ArrayList<Apple>();
// 【震惊!装得了苹果,装不了红苹果】
// ↓Type mismatch:
// cannot convert from ArrayList<RedApple> to ArrayList<Apple>
// ArrayList<Apple> p2 = new ArrayList<RedApple>();
// 【1.<? extends Fruit>,定类型继承关系的上界:】
// 能装Apple以及一切Apple的派生类
ArrayList<? extends Apple> p3 = new ArrayList<Apple>();
p3 = new ArrayList<RedApple>();
// ↓上层的类不接受
// Type mismatch:
// cannot convert from ArrayList<Fruit> to ArrayList<? extends Apple>
// p3 = new ArrayList<Fruit>();
// 【然而,extends是只读的,不能写入】
// p3.add(new Apple());
if (p3.size() != 0) {
Apple apple = p3.get(0);
}
// 【2.<? super Apple>,确定类型继承关系的下界】
// 能装苹果以及一切苹果的基类
ArrayList<? super Apple> p4 = new ArrayList<Apple>();
p4 = new ArrayList<Fruit>();
p4 = new ArrayList<Apple>();
// Type mismatch:
// cannot convert from ArrayList<RedApple> to ArrayList<? super Apple>
// p4 = new ArrayList<RedApple>();
// 【可读可写,读出来的是Object类型】
p4.add(new RedApple());// 子类对象但是可以写进入,因为默认向上转型
Object object = p4.get(0);
System.out.println(object);
// 最后,JDK 7之后,ArrayList后面的<>里什么都不用写
List<Apple> p2 = new ArrayList<>();
}
}
class Fruit {
}
class Apple extends Fruit {
}
class RedApple extends Apple {
}
再论<? extends T>和<? super T>的更多相关文章
- <? extends T>和<? super T>
转自:Java泛型中extends和super的区别? 另,问题来源:Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? <? ext ...
- <? extends T>和<? super T>的理解
背景:对泛型中使用super和extends关键字进行分析总结. 问题: public class TestExtend { public static void main(String[] args ...
- ES6 extends继承及super使用读书笔记
extends 继承 extends 实现子类的继承 super() 表示父类的构造函数, 子类必须在 constructor中调用父类的方法,负责会报错. 子类的 this 是父类构造出来的, 再在 ...
- 一文搞懂List 、List<Object>、List<?>的区别以及<? extends T>与<? super T>的区别
前段时间看<Java编程思想>泛型时对 <? extends T>与<? super T>很懵逼,接着看到泛型与集合的更蒙蔽,随后又翻开<码出高效>时, ...
- <? extends T> 及 <? super T> 重温
<? extends T> 及<? super T> 重温 本文针对泛型中<? extends T> 及<? super T>的主要区别及使用用途进行讨 ...
- JAVA泛型知识--> <? extends T>和<? super T>
<? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...
- JAVA泛型知识(二)--> <? extends T>和<? super T>
<? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...
- 浅谈Java泛型之<? extends T>和<? super T>的区别
关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚.从泛型的英文名字Generic type也能看出,Generic普通. ...
- 复习一下,? extends T 和 ? super T
前话 最近学一些杂七杂八的东西,都把基础给忘了. 比如Java泛型中的 ? extends T和 ? super T 吧. 刚看开源项目的时候遇到它,表情如下: 源码分析 直接用源码来讲解吧 pack ...
随机推荐
- drf 路由生成
前言 在drf中,我们写接口可以通过继承modelViewSet从而达到非常快速的功能实现,这十分的方便,但是modelViewSet由于需要根据不同的参数来对应不同的处理,所以我们写的url最少都需 ...
- 把 Console 部署成 Windows 服务,四种方式总有一款适合你!
一:背景 1. 讲故事 上周有一个项目交付,因为是医院级项目需要在客户的局域网独立部署. 程序: netcore 2.0,操作系统: windows server 2012,坑爹的事情就来了, net ...
- 初始化vue项目
1.创建vue项目命令 vue init webpack deaxios # 使用脚手架创建项目 deaxios(项目名,随便取得) cd deaxios # 进入项目 npm install axi ...
- 微信小程序获取高宽uniapp
代码片段 <template> <view> <view class="text" id="w">补充文字</view ...
- python开发基础(二)运算符以及数据类型之bool(布尔值))
# encoding: utf-8 # module builtins # from (built-in) # by generator 1.147 """ Built- ...
- PHP直播平台源码搭建教程
直播源码市场火爆,但是PHP直播平台源码的搭建过程较为复杂,本文就简单为大家概述一下直播的实现过程以及PHP直播平台源码是如何搭建的. 一.直播的定义 如今PHP直播平台源码绝大部分情况下是指在现场架 ...
- 2、CPU详解
一.五大组成单元 => 三大核心组件 组成计算机五大单元可以合并成三大核心组件:CPU.IO设备.主存储器 1.控制单元+算数逻辑单元 => CPU 2.主存储器,即主记忆体 3.输入单元 ...
- 转载:WIFI无线协议802.11a/b/g/n/ac的演变以及区别
WIFI无线协议802.11a/b/g/n/ac的演变以及区别 版权声明:版权所有,转载须注明出处. https://blog.csdn.net/Brouce__Lee/article/details ...
- 微信支付特约商户进件中base64格式图片上传
微信图片上传接口地址:https://api.mch.weixin.qq.com/v3/merchant/media/upload 1.上传方法 1 using HttpHandlerDemo; 2 ...
- 阅源-jdk8-FunctionalInterface注解
package java.lang; import java.lang.annotation.*; /** * An informative annotation type used to indic ...