泛型的上下边界 : ? 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 怎么 理解?与 ...
随机推荐
- 【NOIP2015普及组】推销员_详解
题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...
- mc面试题记录
1.linux 查看磁盘空间 df -hl 2.根目录下有哪些文件及其作用 3.查找/tmp下的文件内容含有abc的命令 grep -rn "abc" /tmp4.linux下的s ...
- C# 批量新增的两种方法。
public class Test { private static readonly string strConnection = ""; public static void ...
- python 2.7 读写 opc数据
运行环境 python2.7+window server2008+keep server 1.安装OpenOPC a> 下载 OpenOPC-1.3.1.win32-py2.7 (1).exe ...
- sql字符串根据日期产生日期+自增长标志
select Convert(varchar(6), '20180614 20:19:04', 12) + SubString('0000' + Convert(varchar(6), 1 + 1), ...
- C++动态链接库封装
封装一个动态连接库的大致步骤 由于我们部门主要是利用MFC开发,所以我简单的做了一个关于MFC规则动态库的创建以及调用的文档,仅供参考. 新建MFC DLL项目(命名为NewDll) 2.分别为刚见得 ...
- vue作用域插槽的应用
问题场景: 存在一个列表,然后当鼠标放入列表中的名称上的时候,自动弹出简介,类似这种效果, 我们当然可以使用positon relative和absolute搭配达到这样的效果,但是现在有一个奇葩的问 ...
- c++ 查缺补漏
c++句柄 win句柄保存对象的实时地址(对象消失,句柄消失).指针保存固定地址(对象消失,内存泄漏) 超简单句柄类 指针型句柄 管理图书类句柄 c++ 枚举 enum Suit { Diamonds ...
- nginx 判断移动端或者PC端 进入不同域名
自己最近用node.js + react 做了个网站.在PC端上的访问是这样的: 手机访问居然是这样的: 这样用户体验很不好. 所以做了一个移动端的版本. 需求: 需要判断用户是否手机还是电脑 访问网 ...
- 前端使用JS-SDK上传图片(文件)到七牛
Qiniu-JavaScript-SDK (下文简称为 JS-SDK)适用于 :IE11.Edge.Chrome.Firefox.Safari 等浏览器,基于七牛云存储官方 API 构建,其中上传功能 ...