泛型的上下边界 : ? 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 怎么 理解?与 ...
随机推荐
- eclipse如何忽略、过滤不需要提交到svn的文件和目录
1.进入navigator视图 2.选中不需要提交到svn的目录或者文件,右键team->添加至svn:ignore 3.如图:
- Java基础学习-计算机存储单元和数据类型概述
变量是内存中的小容器,用来存储数据.那么计算机内存是怎么存储数据的呢?无论是内存还是硬盘,计算机存储设备的最小信息单元叫“位(bit)”,我们又称之为“比特位”,通常用小写字母b表示.而计算机最小的存 ...
- Bigger-Mai 养成计划,Python基础巩固三
1.集合的基本操作(set)集合是一个无序的,不重复的元素集合,他的主要作用是去重:把一个列表变为集合就自动去重了.关系测试:测试两组数据之间的交集,差集,并集等关系 list_1 = [1,4,6, ...
- Cent OS6下SS+BBR+改SSH端口
SS+BBR+改SSH端口 (一)搭建SS wget --no-check-certificate -O shadowsocks-libev.sh https://raw.githubusercont ...
- MockMvc模拟对controller进行单元测试
本文为博主原创,未经允许不得转载: MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快.不依赖网络环境, 而且提供了一套验证的 ...
- linux下ifconfig命令看不到IP centos7——ens33
当前环境VMware15+centos7 在终端输入ifconfig后没有开到IP地址: 解决方法:root用户执行命令 cd /etc/sysconfig/network-scripts/ vi ...
- 使用ffmpeg进行视频封面截取
项目需求:用户上传视频格式的文件,需要转为指定编码的MP4格式(为了适应在线播放),并且截取视频的第一帧作为封面图片(用于展示) 实现: 1.下载ffmpeg.exe 地址:http://ffmpeg ...
- memcached源码分析-----slab内存分配器
温馨提示:本文用到了一些可以在启动memcached设置的全局变量.关于这些全局变量的含义可以参考<memcached启动参数详解>.对于这些全局变量,处理方式就像<如何阅读memc ...
- git图形化界面gitk里中文乱码解决
将git全局配置成utf-8格式即可,命令行里输入 git config --global gui.encoding utf-8
- CopyOnWriteArrayList与Collections.synchronizedList的性能对比(转)
列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ...