泛型的上下边界 : ? 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 怎么 理解?与 ...
随机推荐
- Java基础学习-类型转换之隐式转换
+是一个运算符,我们应该能够看懂,做数据的加法. boolean类型不能转换为其他的数据类型. 默认转换: byte,short,char--int--float--double by ...
- 记python使用grpc
using grpc in Python gRPC是基于http/2的RPC框架,使用ProtoBuf作为底层数据序列化.Nginx服务器2018年3月17日引入gRPC支持. gRPC 是用来实现跨 ...
- Maven解决包冲突
依赖树 $ mvn dependency:tree [WARNING] [WARNING] Some problems were encountered while building the effe ...
- 部署springboot项目时 打包成jar时包中html,js,css文件缺失
问题 打包出来的jar包里面没有html,js,css文件 解决方案 在pom.xml文件下的build选项中的src/main/resources的目录下 添加配置 <build> &l ...
- R-画图
1.par(mar=c(8,5.2,8,5.2),new=TRUE,cex=1.5,mfrow=c(2,2)) (参考:http://blog.sina.com.cn/s/blog_6caea8b ...
- Thinkphp5.0 多图上传名称重复BUG
- SparkStreaming流处理
一.Spark Streaming的介绍 1. 流处理 流式处理(Stream Processing).流式处理就是指源源不断的数据流过系统时,系统能够不停地连续计算.所以流式处理没有什么 ...
- extract method
函数 简短,命名良好 函数名描述的是做什么 而不是怎么做 行数过高的代码中 将一大段做一个事的代码提取到独立的method 中 高层函数直接引用. 创建新函数 将提炼的代码平移到目标函数中 检查是否引 ...
- Activity与Fragment数据传递之Fragment从Activity获取数据
整理Fragment与Activity之间的数据交换,大体上包括三种: 1.Fragment从Activity获取数据 2.Activity从Fragment获取数据 3.Fragment之间获取数据 ...
- Git更改用户名与回退操作
1. 更改本地用户名和邮箱 git config --global user.name "Your_username" git config --global user.email ...