Java Generics and Collections-2.4-2.5
2.4 The Get and Put Principle
Get and Put Principle:
用于取对象的泛型集合,声明为 <? extends T>
用于存对象的泛型集合,声明为 <? super T>
如果同时存取,那么还是老老实实的用< T>吧
注意:
void put(List<? extends Number> nums){
nums.add(?)
}
上面代码中'?'处只能放入null
值,因为你并不能确定nums
具体是什么类型的List
,可能是List< Integer>
也可能是List< Double>
等,而它们共有的add方法一个是add(Integer i)
另一个是add(Double d)
,因此只能放入null
。
`List<? extends T>`实际使用中,只能是一种类型的集合,而不是说这个集合中的对象类型从`?`到 `T`,这里要好好理解这句话。
2.5 Arrays
看如下代码:
package java_generics_collections.chap2;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created by jintaox on 2016/3/9.
*/
public class Test_2_5 {
@Test
public void test01() {
Integer[] ints = new Integer[]{1, 2, 3};
Number[] nums = ints;
nums[2] = 2.3;//runtime error :java.lang.ArrayStoreException: java.lang.Double
}
@Test
public void test_02() throws Exception {
List<Integer> ints = new ArrayList<>();
// List<Number> nums = ints;// compile error
}
}
java中规定,数组是协变的,即如果S是T的字累型,那么S[]是可以替换T[]的,即在任何需要T[]的地方传入s[]是没问题的。
但是泛型不是协变的,前面也说了List< S> 不能替换List< T>。java通过<? extends T>实现协变。
同时,java通过<? super T> 实现逆变(其实,协变逆变从前面阅读到这里应该也明白了),而数组是不支持逆变的。也即,java没有提供对泛型数组的支持。
泛型泛型,就是个泛指,就是让你忽略具体类型的,对这些对象做一系列操作。因此,泛型也就是更高的一种抽象层次,唉,随便说说,也许理解透彻了,别人也就更容易理解了。
Java Generics and Collections-2.4-2.5的更多相关文章
- 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-2.3
2.3 Wildcards with super 这里就直接拿书上的例子好了,这是Collections里面的一个方法: public static <T> void copy(List& ...
- 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 ...
随机推荐
- android笔记:获取View组件宽度以及ViewTreeObserver
View宽高测量方法: 测量方法有三种,如下: 1)(直接在onCreate()执行) int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureS ...
- Log4net入门(日志文件篇)
在上一篇Log4net入门(控制台篇)中,我们将日志信息输出到控制台中,在这一篇中,我们将描述如何将日志信息写到文件中.要将日志信息写入文件非常简单,只需要在Log4net.config配置文件中添加 ...
- Django:手把手带你入门
一.开发环境: Python:2.7:PyCharm 4 二.Django的安装: 打开Pycharm --> 新建项目--> 看图操作--> 自动安装Django环境 三.创建第一 ...
- Cesium原理篇:Batch
通过之前的Material和Entity介绍,不知道你有没有发现,当我们需要添加一个rectangle时,有两种方式可供选择,我们可以直接添加到Scene的PrimitiveCollection,也可 ...
- FFmpeg学习1:视频解码
在视频解码前,先了解以下几个基本的概念: 编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分. 容器/多媒体文件(Container/File):没有了解 ...
- PID控制
PID解释: 位置式: 可以看出,比例部分只与当前的偏差有关,而积分部分则是系统过去所有偏差的累积.位置式PI调节器的结构清晰,P和I两部分作用分明,参数调整简单明了.但直观上看,要计算第拍 ...
- “NOSQL” 杂谈
引言: nosql 的兴起和革命,在我看来已经开始逐渐影响到了传统的sql的地位,但是仅仅是影响而已,取代是不太可能的. 正文: 两年前,一个偶然的机会开始接触到 nosql ( mongodb ). ...
- 不到一百行实现一个小siri
想要容易理解核心的特征计算的话建议先去看看我之前的听歌识曲的文章,传送门:http://www.cnblogs.com/chuxiuhong/p/6063602.html 本文主要是实现了一个简单的命 ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- JavaScript原型OOP——你上车了吗?
.title-bar { width: 80%; height: 35px; padding-left: 35px; color: white; line-height: 35px; font-siz ...