泛型的上下边界 : ? extends E 与 ? super T
public class Problem {
public static void main(String[] args) {
List<? extends A> list;
List<SonA> list2 = new ArrayList<SonA>();
list = list2;
list.add(new SonA() //error
list2.add(new SonA());
A a=list.get();
}
}
class A extends FatherA {
}
class SonA extends A {
}
class FatherA {
}
由代码可知,? extend A表示list集合里面装的都是A的子类,因此arraylist中的对象只能存放A的子类,但是list.add(new SonA())编译时不可通过的.因为list中只是指定了一个范围,并没有特定一个类,所以不能使用add方法对list进行集合的add,会出现转换的错误。然而能使用get方法,因为集合中的类型都可以用父类A 来表示
public static void main(String[] args) {
List<? super A> list = new ArrayList<FatherA>();
// List<? super A> list=new ArrayList<SonA>(); error
List<FatherA> list2 = new ArrayList<FatherA>();
list2.add(new FatherA());
list.add(new SonA());
// list.add(new FatherA()); error
Object o = list.get(0);
FatherA a = (FatherA) o;
}
}
这就是 ?suepr A ,list集合中存放的是A的父类 所以能指向FatherA的arraylist,那为什么这里能使用add呢,因为list中都是A或A的父类,如果把A的子类添加进去是不影响的,因为这些子类都能用A或者A的父类来表示,能进行上转型。但是添加A的父类就不行了,因为互相之间不知道有什么联系,会出现类型错误。get的时候只能用超类Object表示,但是能进行向下转型。
其实,一个集合中只能用一个类型来表示,只要互相之间能转换就行。
泛型的上下边界 : ? extends E 与 ? super T的更多相关文章
- Java 之泛型通配符 ? extends T 与 ? super T 解惑
简述 大家在平时的工作学习中, 肯定会见过不少如下的语句: List<? super T> List<? extends T> 我们都知道, 上面的代码时关于 Java 泛型的 ...
- 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 泛型】之 <? super T> 和<? extends T> 中 super ,extends如何理解?有何异同?
Java 泛型 <? super T> 和<? extendsT>中 super ,extends怎么 理解?有何不同? 简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型 ...
- 浅谈Java泛型之<? extends T>和<? super T>的区别
关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚.从泛型的英文名字Generic type也能看出,Generic普通. ...
- Java泛型 PECS(Producer Extends, Consumer Super)
本文转载自ImportNew,原文链接 Java 泛型: 什么是PECS(Producer Extends, Consumer Super) PECS指“Producer Extends,Consum ...
- Java泛型的定义以及对于<? extends T>和<? super T>
Java 中对于泛型方法的定义: public <T> T getT(){ .....相关代码; } 其中我对<T>的理解就是申明只是一个泛型方法的标记,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 ...
- 再论<? extends T>和<? super T>
参考: https://www.cnblogs.com/drizzlewithwind/p/6100164.html Java 泛型 <? super T> 中 super 怎么 理解?与 ...
随机推荐
- Bootstrap3基础 栅格系统 col-lg/md/sm/xs-* 简单示例
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- EFI系统引导的一些零碎知识点
EFI目录 下图只有Boot和Microsoft,如果你还装其他系统可能还会有其他的文件夹,比如你还装了Ubuntu(或者manjaro),那么会有个叫Ubuntu(manjaro)的文件夹与Boot ...
- AI illustrator 如何裁剪图片(扣取局部区域)
AI如何裁剪图片 在使用illustrator的过程中,很多亲想要AI的裁剪功能与ps一样强大,但是AI常用的裁剪图片方法如下. 工具/原料 illustrator cs6 应用剪切蒙版剪切图片 ...
- nodejs中使用crypto-js先HmacSha1加密后转Base64
1. 先HmacSha1后Base64 var HmacSha1 = require('crypto-js/hmac-sha1') ;var Base64 = require('crypto-js/e ...
- div变成输入框
<style> #test{ width: 150px;; min-height:20px; max-height:70px; outline: 0; border: 1px solid ...
- element-UI——el-table添加序号
转载自:https://www.cnblogs.com/langxiyu/p/10641060.html Part.1 示例 当我们想在 el-table 中添加序号列时,如下: <el-tab ...
- DAY 22初识面向对象
一.两种编程思想 1.面向过程编程 核心是'过程',过程指的是解决问题的步骤,就是先干什么再干什么 基于面向过程思想编写程序相当于写一条流水线,是一种机械式的思维方式 优点:解决问题的思路清晰,可以把 ...
- numpy和matplotlib
Python的科学计算包 – Numpy numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算.这个库的前身是1995年就开始开发的一个用于数 ...
- 论文笔记(Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration)
这是CVPR 2019的一篇oral. 预备知识点:Geometric median 几何中位数 \begin{equation}\underset{y \in \mathbb{R}^{n}}{\ar ...
- Mittag-Leffer函数, Matlab内部函数
Mittag-Leffer函数: $E_{\alpha,\beta}(x) = \sum\limits^{\infty}_{k=0} \frac{x^k}{ \Gamma( \alpha k + \b ...