2.3 Wildcards with super

这里就直接拿书上的例子好了,这是Collections里面的一个方法:

public static <T> void copy(List<? super T> dst,List<? extends T> src){
for(int i = 0; i < src.size(); i++){
dst.set(i,src.get(i));
}
}

其中<? super T> 表示T以以及T的父类,java的泛型规定了

List<? super T>List< T>的超类。

上面的方法有可能会有如下几个变种(通过这几个变种来解释上面这个方法):

1, `copy(List< T> dst, List<? extends T> src)`
2, `copy(List< T> dst, List< T> src)`
3, `copy(List<? extends T> dst, List< T> src)`
4, `copy(List<? extends T> dst, List<? extends T> src)`
5, `copy(List<? super T> dst, List< T> src)`
6, `copy(List< T> dst, List<? super T> src)`
7, `copy(List<? super T> dst, List<? super T> src)`
8, `copy(List<? super T> dst, List<? extends T> src)`

唉,其实写这些就是为了说明java泛型的使用 ,就是让它自圆其说罢了,这仅仅是java的泛型规范,人家就这么设计的,咱们就这么用。

1,我们把dst限制死了,如T为Number,那么dst只能是List< Number> src可以是List< Integer> or List< Double> ...不够generic(哈哈,不够泛型)
2,同第一个,dst,src都限制死了,这根本不generic!!!
3,这是错误的,比如dst为List< Integer>, src为List< Number>,如
```java
List< Integer> dst = new ArrayList<>();
List< Number> src = Arrays.asList(1,2,3.4);
copy(dst,src)//compile error,你不能向List< Integer>里面放 3.4
```
4,看起来挺正常,实际上只有前后类型一样使,即情况2时,才能正常工作
5,不够generic,但是一定正确,因为T一定是<? super T> 的子类型,实际上和1差不多
6,当且进档src也是List< T>的时候才正确,运行出错
7, 4的另一个版本,当且仅当类型相同时才能编译通过
8,正确,generic!!!

为什么8是最generic的呢? 其实你看到这里自己就明白了(这里面是有规律的,而且以后学Scala的协变,逆变即+T,-T时,这是基础)。

加油,我要做技术专家。

Java Generics and Collections-2.3的更多相关文章

  1. python 中的sort 和java中的Collections.sort()函数的使用

    x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...

  2. Java Concurrency - Concurrent Collections

    Data structures are a basic element in programming. Almost every program uses one or more types of d ...

  3. thinking in java Generics Latent typing

    The beginning of this chapter introduced the idea of writing code that can be applied as generally a ...

  4. Thinking in java——Generics

    ​Ordinary classes and methods work with specific types: either primitives or class types. If you are ...

  5. 【Java】Java中的Collections类——Java中升级版的数据结构【转】

    一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数 ...

  6. Java中的Collections类

    转载:https://blog.csdn.net/yangxingpa/article/details/80515963 从[Java]Java中的Collections类——Java中升级版的数据结 ...

  7. Java Generics and Collections-8.1

    8.1 Take Care when Calling Legacy Code 通常,泛型都是在编译时检查的,而不是运行时.便意识检查可以提早通知错误,而不至于到运行时才出问题. 但有时后编译时检查不一 ...

  8. java List 排序 Collections.sort() 对 List 排序

    class User { String name; String age;  public User(String name,String age){  this.name=name;  this.a ...

  9. 黑马程序员——JAVA基础之Collections和Arrays,数组集合的转换

    ------- android培训.java培训.期待与您交流! ---------- 集合框架的工具类:        Collections : 集合框架的工具类.里面定义的都是静态方法. Col ...

随机推荐

  1. webpack+react+es6开发模式

    一.前言 实习了两个月,把在公司用到的前端开发模式做个简单的整理.公司里前端开发模式webpack+react+redux+es6,这里去掉了redux. webpack, react, redux等 ...

  2. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

  3. Reactor by Example--转

    原文地址:https://www.infoq.com/articles/reactor-by-example Key takeaways Reactor is a reactive streams l ...

  4. 【Python五篇慢慢弹】数据结构看python

    数据结构看python 作者:白宁超 2016年10月9日14:04:47 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc ...

  5. ASM磁盘组扩容流程

    环境:RHEL 6.5 + GI 11.2.0.4 + Oracle 11.2.0.4 1.确认磁盘权限正确 2.图形界面配置 3.启用asmca配置 4.修改磁盘组rebalance power级别 ...

  6. windows环境tomcat8配置Solr5.5.1

    前言 前前后后接触Solr有一个多月了,想趁着学习Solr顺便把java拾起来.我分别用4.X和5.X版本在windows环境下用jetty的方式.tomcat部署的方式自己搭建了一把.其中从4.x到 ...

  7. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

  8. 把PDF的底色改成护眼色,这样读起文章来就不是很累了······

    PDF格式背景改变方法如下: 打开PDF 点击 编辑 ->首选项->辅助工具->选中"替换文档颜色"和" 自定义颜色"->将背景颜色改成 ...

  9. UWP简单示例(二):快速开始你的3D编程

    准备 IDE:Visual Studio 2015 了解并学习:SharpDx官方GitHub 推荐Demo:SharpDX_D3D12HelloWorld 第一节 世界 世界坐标系是一个特殊的坐标系 ...

  10. 数据库插入数据返回当前主键ID值方法

    当我们插入一条数据的时候,我们很多时候都想立刻获取当前插入的主键值返回以做它用.我们通常的做法有如下几种: 1. 先 select max(id) +1 ,然后将+1后的值作为主键插入数据库: 2. ...