Java Generics and Collections-2.3
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的更多相关文章
- python 中的sort 和java中的Collections.sort()函数的使用
x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...
- Java Concurrency - Concurrent Collections
Data structures are a basic element in programming. Almost every program uses one or more types of d ...
- thinking in java Generics Latent typing
The beginning of this chapter introduced the idea of writing code that can be applied as generally a ...
- Thinking in java——Generics
Ordinary classes and methods work with specific types: either primitives or class types. If you are ...
- 【Java】Java中的Collections类——Java中升级版的数据结构【转】
一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数 ...
- Java中的Collections类
转载:https://blog.csdn.net/yangxingpa/article/details/80515963 从[Java]Java中的Collections类——Java中升级版的数据结 ...
- Java Generics and Collections-8.1
8.1 Take Care when Calling Legacy Code 通常,泛型都是在编译时检查的,而不是运行时.便意识检查可以提早通知错误,而不至于到运行时才出问题. 但有时后编译时检查不一 ...
- java List 排序 Collections.sort() 对 List 排序
class User { String name; String age; public User(String name,String age){ this.name=name; this.a ...
- 黑马程序员——JAVA基础之Collections和Arrays,数组集合的转换
------- android培训.java培训.期待与您交流! ---------- 集合框架的工具类: Collections : 集合框架的工具类.里面定义的都是静态方法. Col ...
随机推荐
- js和jquery实现简单的选项卡
选项卡切换在做网页的时候经常会用到,以往都是用JQ来实现,代码简单易懂,今天用原生的js实现了一下,二者还是有很大不同的,可以对比一下代码来研究一下. <!DOCTYPE html> &l ...
- Ubuntu下配置Samba服务器
每次配置Samba 都需要上网去查资料,而且有一些不一定适合.所以自己就简单记录一下 1.Samba的安装 sudo apt-get insall samba // (sudo get temp ro ...
- Cesium原理篇:GroundPrimitive
今天来看看GroundPrimitive,选择GroundPrimitive有三个目的:1 了解GroundPrimitive和Primitive的区别和关系 2 createGeometry的特殊处 ...
- SpringMVC一路总结(一)
SpringMVC听闻已久,早在去年就被学长问到关于SpringMVC的基础知识,当时也没在意.主要是工作中也没有用到关于SpringMVC的技术,因此免于没有时间和精力的借口就没有接触和学习Spri ...
- 5.C#WinForm基础登陆失败三次退出系统
目标: 登陆界面,登陆错误三次退出程序.假设用户名密码是admin.888888,不区分大小写,(易错点:局部变量与类变量) 局部变量每次运行完毕变量的值都会被销毁,下次再运行,会重新初始化. ...
- Bash简明教程--变量
1. 前言 Bash是一门流行在*nix系统下的脚本语言.作为一门脚本语言,变量是一门语言的基本要素,在这篇教程中,我们将学习Bash中的变量是怎么表示的,以及变量相关的一些语法规则. 2. Bash ...
- Java进击C#——应用开发之Asp.net
本章简言 上一章中笔者讲到关于Linq和EF的用法.并以hibernate来进行讲解.那么本章笔者来讲一下C#的Asp.Net.即是在B/S模式下开发.现在企业大部分的业务都是面向B/S模式的.所以对 ...
- 记录软件工程课程项目开发时遇到的各种小问题(django)
1.python manage.py makemigrations 无效/无法检测出model的变化 在修改了models.py之后,我们想要更新数据库的表,使用了python manage.py m ...
- 「译」JUnit 5 系列:架构体系
原文地址:http://blog.codefx.org/design/architecture/junit-5-architecture/ 原文日期:29, Mar, 2016 译文首发:Linesh ...
- ubuntu 入门
ubuntu 系统设置不全sudo apt-get install ubuntu-desktop uget aria2:下载工具http://www.xitongzhijia.net/xtjc/201 ...