关于泛型的super与extends 的set方法
类Test<T>{
T t;
getT();
setT(T t);
}
假设有类Zi,和类Fu,Zi 继承Fu.
method(Test<? extends Fu> test){
//下面两个set都会报错
test.setT(new Zi());
test.setT(new Fu());
}
而使用super
method(Test<? super Zi> test){
//正确
test.setT(new Zi());
//报错
test.setT(new Fu());
}
这是为什么呢?分析下
先看extends <? extends Fu> 为什么不能set值:
1.当传入的Test对象为Test<Zi> 时,T为Zi(泛型擦除)
2.如果这时候有一个新的类Zi1继承Fu
2.1.这时候传入Zi1,语法错误Zi≠Zi1
2.2.这时候如果传入Fu,若Fu = Zi1,依然语法错误
总结:当泛型擦除后,你无法确定传入的值究竟是什么,这就会引发一个安全问题。如果对于安全角度考虑,作为编译器,上面两种传值就会有问题。所以此处不能set。
再来看看super <? super Zi>为什么能set Zi 而不能set Fu
1.当传入的Test对象为Test<Zi>时,T为Zi
2.传Zi正常不用说,即使传入的为Test<Fu> 传Zi对象依然安全
3.传Fu为什么不行呢?和extends同理,如果此时有Zi1继承Fu,若Fu = Zi1,此时将Fu传入依然会有安全问题(类型转换异常)。
总结:无论是super还是extends,两者的限定的语法前提下都有一个目的,就是安全性。所以基于安全性的考虑就有了上面的语法问题。
关于泛型的super与extends 的set方法相关推荐
- 浅显理解Java泛型的super和extends
目录 概念简单理解 代码样例解读 关于List<? super T> add方面 返回值方面 关于List<? extendsT> add方面 返回值方面 总结 概念简单理解 ...
- Java 泛型中? super T和? extends T的区别
原文链接 李璟(jlee381344197@gmail.com) 经常发现有List<? super T>.Set<? extends T>的声明,是什么意思 ...
- java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等
java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...
- Java泛型教程–示例类,接口,方法,通配符等
泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 在集合类中使用泛型非常容易,但是它提供了比仅创 ...
- [转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍
参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中 方法外 调 ...
- 泛型中? super T和? extends T的区别
经常发现有List<? super T>.Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? ex ...
- java gt_JAVA泛型知识--gt; lt;? extends Tgt;和lt;? super Tgt;
extends T> 和 super T> 是Java泛型中的"通配符(Wildcards)" 和 "边界(Bounds)"的概念 extends ...
- java面试 泛型_Java面试题五:Java 的泛型, super T 和 extends T 的区别
相关文章: java泛型通配符 ? extends T 和 ? super T 的区别和用法 一.二者的意思 ? extends T :表示上界是T, ? 都是继承自T的,都是T的子类: ? supe ...
- java comparable 泛型_Java泛型的应用——T extends Comparable? super T
在观察Java源码的时候,发现了这么一个写法T extends Comparable super T>.不禁纳闷为什么要这么写呢?有什么好处吗,extends和super在这里的作用着实让人有点 ...
最新文章
- MAX487制作RS485总线接口模块
- ThreadLocal类
- C++ new delete操作符
- 诡异的bug: tcsh陷入死循环
- c#实现多线程代码例子
- Advice for students of machine learning--转
- poj 3207 2-sat
- 参数化测试 junit_参数化的JUnit测试
- 关于程序组织和组织技巧的学习
- 95-33-020-ChannelHandler-ChannelHandler简介
- 黑石集团(Black Stone)黑岩公司(Black Rock)
- 酷Q on Docker 2.0
- 云计算 third day
- Java的三种技术架构是什么?
- 【Day6.2】现金所剩无几,机智想办法去机场
- 声明:博客内容不得用于商业用途,仅做学习交流。
- 计算机以太网,局域网,互联网,令牌网,ATM网络
- modbus4j.jar实现modbus urt模式
- git检出新分支遇到的文件路径过长Filename too long的问题
- lua pairs与ipairs区别
热门文章
- 华为鸿蒙harmony操作系统 安装使用及下载地址
- python import gc_即使在gc.collect()之后,分配给Python的内存也不会在Linux中释放回来...
- java调用序列_基于JAVA的苹果序列号接口调用代码实例
- 程序员锁死服务器搞垮上家公司后,下家公司说不敢惹不敢惹!
- 计算机图形学绘图程序设计
- 浪潮软件2018年销售额达12.1亿元 同比下降6.88%
- mybatis-三层架构
- 能量谱密度 功率谱密度
- 【JavaScript】DOM查询(子节点、父节点、兄弟节点)源码详解
- [腾讯社区开放平台].NET SDK基于New BSD协议开源