类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方法相关推荐

  1. 浅显理解Java泛型的super和extends

    目录 概念简单理解 代码样例解读 关于List<? super T> add方面 返回值方面 关于List<? extendsT> add方面 返回值方面 总结 概念简单理解 ...

  2. Java 泛型中? super T和? extends T的区别

    原文链接          李璟(jlee381344197@gmail.com) 经常发现有List<? super T>.Set<? extends T>的声明,是什么意思 ...

  3. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等

    java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...

  4. Java泛型教程–示例类,接口,方法,通配符等

    泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 在集合类中使用泛型非常容易,但是它提供了比仅创 ...

  5. [转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍

    参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中  方法外 调 ...

  6. 泛型中? super T和? extends T的区别

    经常发现有List<? super T>.Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? ex ...

  7. java gt_JAVA泛型知识--gt; lt;? extends Tgt;和lt;? super Tgt;

    extends T> 和 super T> 是Java泛型中的"通配符(Wildcards)" 和 "边界(Bounds)"的概念 extends ...

  8. java面试 泛型_Java面试题五:Java 的泛型, super T 和 extends T 的区别

    相关文章: java泛型通配符 ? extends T 和 ? super T 的区别和用法 一.二者的意思 ? extends T :表示上界是T, ? 都是继承自T的,都是T的子类: ? supe ...

  9. java comparable 泛型_Java泛型的应用——T extends Comparable? super T

    在观察Java源码的时候,发现了这么一个写法T extends Comparable super T>.不禁纳闷为什么要这么写呢?有什么好处吗,extends和super在这里的作用着实让人有点 ...

最新文章

  1. MAX487制作RS485总线接口模块
  2. ThreadLocal类
  3. C++ new delete操作符
  4. 诡异的bug: tcsh陷入死循环
  5. c#实现多线程代码例子
  6. Advice for students of machine learning--转
  7. poj 3207 2-sat
  8. 参数化测试 junit_参数化的JUnit测试
  9. 关于程序组织和组织技巧的学习
  10. 95-33-020-ChannelHandler-ChannelHandler简介
  11. 黑石集团(Black Stone)黑岩公司(Black Rock)
  12. 酷Q on Docker 2.0
  13. 云计算 third day
  14. Java的三种技术架构是什么?
  15. 【Day6.2】现金所剩无几,机智想办法去机场
  16. 声明:博客内容不得用于商业用途,仅做学习交流。
  17. 计算机以太网,局域网,互联网,令牌网,ATM网络
  18. modbus4j.jar实现modbus urt模式
  19. git检出新分支遇到的文件路径过长Filename too long的问题
  20. lua pairs与ipairs区别

热门文章

  1. 华为鸿蒙harmony操作系统 安装使用及下载地址
  2. python import gc_即使在gc.collect()之后,分配给Python的内存也不会在Linux中释放回来...
  3. java调用序列_基于JAVA的苹果序列号接口调用代码实例
  4. 程序员锁死服务器搞垮上家公司后,下家公司说不敢惹不敢惹!
  5. 计算机图形学绘图程序设计
  6. 浪潮软件2018年销售额达12.1亿元 同比下降6.88%
  7. mybatis-三层架构
  8. 能量谱密度 功率谱密度
  9. 【JavaScript】DOM查询(子节点、父节点、兄弟节点)源码详解
  10. [腾讯社区开放平台].NET SDK基于New BSD协议开源