Java泛型与集合笔记
第一章
Java的泛型为了兼容性和防止代码爆炸,在编译成字节碼时会进行类型擦除,编译器自动添加代码做类型转换(用到List<Integer>的地方用Integer来做转换),自动做装箱拆箱,做foreach替换,在多个参数的情况下自动打包进一个数组里
泛型的T一个是定义,是个是使用。使用的时候会包含定义。尖括号里可以使用通配符,编译器的类型转换只对尖括号里起作用
第二章 子类和通配符
2.1
子类型替换原则:赋值里,等号右边可以使用父类型值的地方,用可以用子类的对象地址值替换。
List<Integer>不是List<Number>的一个子类,二者也不想等,不可以直接赋值;List<Number>是Collection<Number>的一个子类,看尖括号之外的,不看里边的,编译器看到的是外边的继承关系。尖括号里边的一点意义都没有,因为这里不是主体,外边操作的不是他的方法。List<Integer>也不是Collection<Number>的子类
通配符用在尖括号引入subtype的地方,来规避上边的限制
2.2
List<Integer>是Collection<? extend Number>的子类。通配符在这里起了作用,会把要操作的泛型先转换为Number来处理
extend只能get和用在变量生命处,下边的代码错误是因为nums的项为(Integer)nums[i],而3.14转化为Number,父类不能赋给子类
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
List<? extends Number> nums = ints;
nums.add(3.14); // compile-time error
assert ints.toString().equals("[1, 2, 3.14]"); // uh oh!
2.3
List<Object>是List<? super Number>的子类,用父类的地方可以用子类代替
2.4
null不受put原理影响,null是所有类的子类;object不受get原理影响
2.5
使用带星号的List泛型替代Array,可以在编译的时候检查到违法赋值
Array不能用super关键字 (? super Integer)[]
2.6
Collection<?> 等价于 Collection<? extends Object>
?可以适用于任何类型
type parameter ( Collection<? extends E> c )只针对基类及其子类类型有效
2.7
两个?的容器不能互相赋值,因为无法确定下来类型
2.8
?有三个地方不能用,分别是顶层new,泛型方法显示传参,extend和implements的父类不能是?,
第三章 比较和边界
3.1
Comparator是一个包含compareTo方法的接口
interface Comparable<T> {
public int compareTo(T o);
}
compareTo应该和equal同步
null导致comparteTo抛异常,在被比较值不为null的情况下
compareTo用于与自然顺序逻辑不同的比较中
3.2
函数声明中尖括号里是类型边界,只能使用extend关键字
这二者等价
<T extends Comparable<T>> T max(Collection<T> coll)
<T extends Comparable<? super T>> T max(Collection<? extends T> coll)
3.3
Comparable接口在不同类的层级实现,可以比较的对象不同。在基类实现,则所有子类可以混合比较
3.4
Comparator接口是比较器,用来实现不同于Comparable接口的逻辑,有两个接口
interface Comparator<T> {
public int compare(T o1, T o2);
public boolean equals(Object obj);
}
3.5
枚举原型是 public abstract class Enum<E extends Enum<E>> implements Comparable<E> ,子类是 final class Season extends Enum<Season>
3.6
泛型可以有多个边界限制,用&分隔
3.7
负责做类型擦除(转换)提供一致接口自动生成的代码叫做桥,桥覆盖父类或者接口里的方法保证编译正确,会调用使用真正泛型参数的代码。方法签名里有bridge关键字
3.8 协议覆盖
如果一个方法的参数和父类的相同,返回值是父类方法返回值的子类,那么自动override,不用转换一次了。运用的就是brigde技术,自动生成一个桥方法简单调用覆盖的实现方法
第四章 声明
4.1
final class Season extends Enum<Season>
Java泛型与集合笔记的更多相关文章
- Java泛型和集合之泛型VS模板
Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义.语法看起来是相似的,可是语义却明显是不同的. 在语法上讲,选择尖括号 是因为他 ...
- Java泛型和集合之泛型介绍
在声明一个接口和类的时候可以使用尖括号带有一个或者多个参数但是当你在声明属于一个接口或者类的变量的时候或者你在创建一个类实例的时候需要提供他们的具体类型.我们来看下下面这个例子 List<Str ...
- Java 泛型与集合
1.List练习,请用泛型的写法来完成. 已知有一个Worker 类如下: public class Worker { private int age; private String name; p ...
- 笔记-java泛型详解
首先,先说明一下,java泛型文章的出处:http://www.cnblogs.com/lzq198754/p/5780426.html 作为学习笔记保存. 1.为什么需要泛型 泛型在Java中有很重 ...
- Java泛型学习笔记 - (七)浅析泛型中通配符的使用
一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...
- .Net 笔记(二) 泛型和集合
前言: 本文中介绍 泛型和集合的区别.也算是自己的一个知识点的回顾,并且把它们写在自己的笔记中. 1.集合: 在讲到集合之前,我们先来回顾下数组的知识点吧,因为集合和数组的关系也是比较微妙的各有利弊, ...
- java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨
java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类.内部类应用于泛型探讨 //Sets.java package org.rui.generics.set; import j ...
- Java泛型学习笔记--Java泛型和C#泛型比较学习(一)
总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...
- Java核心技术卷一基础知识-第12章-泛型程序设计-读书笔记
第12章 泛型程序设计 本章内容: * 为什么要使用泛型程序设计 * 定义简单泛型类 * 泛型方法 * 类型变量的限定 * 泛型代码和虚拟机 * 约束与局限性 * 泛型类型的继承规则 * 通配符类型 ...
随机推荐
- duration of lease 1 0.5 0.875 DHCP 租借时间 续租时间 重新绑定时间
w
- 千万别在Java类的static块里写会抛异常的代码!
public class Demo{ static{ // 模拟会抛异常的代码 throw new RuntimeException(); } } 如果你在Java类的static块里写这样会抛异常的 ...
- 如何让ls按目录和文件 分开进行列表?
linux的思想是: 有很多 "小工具", 但是功能并不弱的 小工具, 组合起来完成一些复杂的工作, 通过 这些工具的组合可以完成各种各样的, 不同的任务. 如: ls, sort, hea ...
- 【转】Python3中遇到UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128)
[转]Python3中遇到UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128) ...
- 002-使用Spring实现读写分离(MySQL实现主从复制)
一. 背景 一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大主库,负责写入数据,我们称之为:写库:从库,负责读取数据,我们称之为:读库: 1. 读库和写库的数据一致:2. 写数 ...
- VMware 虚拟化编程(13) — VMware 虚拟机的备份方案设计
目录 目录 前文列表 备份思路 备份算法 备份细节 连接到 vCenter 还是 ESXi 如何选择快照类型 是否开启 CBT 如何获取备份数据 如何提高备份数据的传输率 备份厚置备磁盘和精简置备磁盘 ...
- 【EWM系列】SAP EWM Warehouse Order Creation
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[EWM系列]SAP EWM Warehouse ...
- 【ABAP系列】SAP ABAP 用BAPI批量导入物料的质量视图
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP ABAP 用BAPI批量导入 ...
- 用 Eclipse 开发 WebService 项目
1.安装tomcat 2.安装CXF 一.为新渠道webservice加入到项目中 首先,创建一个springboot项目,名为webservice-baffle(附件中). 第二步,新建web se ...
- Navicat批量导出mysql的DDL语句
工作中有的时候需要将某个库中的表.视图.函数.存储过程等创建语句导出,又不需要表中的数据.同时最好放在同一个文件里面,这样方便拷贝. 方法一:需要拷贝的创建语句条数不多,不至于让你拷到头脑发晕的地步, ...