泛型(Generics)
为什么会有泛型 ?
早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。-
泛型的好处
- 提高了程序的安全性
- 将运行时的问题转到了编译期
- 省去了类型转换的麻烦
泛型的应用
- 泛型类
格式: public class 类名<泛型类型1,…> 注意泛型类必须是引用类型
public class 类名<T, U, K, ...> 命名规则只要符合标识符的限定就行,但一般用单个大写字母
T:type
E:element
K:key
V:value
- 泛型方法
格式: public <泛型类型> 返回类型 方法名(泛型类型 .)
- 泛型接口
格式: public interface 接口名<泛型类型1…> 如果没有传递参数化类型,默认是Object
实现的接口可以是泛型类,也可以不是
-
通配符
泛型集合不是一个可协变类型,数组是可协变类型- 泛型通配符<?>
任意类型,如果没有明确,那么就是Object以及任意的Java类了 - ? extends E
向下限定,E及其子类 - ? super E
向上限定,E及其父类
- 泛型通配符<?>
增强型for
增强for概述
简化数组 和 Collection 集合的遍历
public interface Iterable<T> 实现这个接口允许对象成为 "foreach" 语句的目标。
for (元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
好处:简化遍历
坏处:对于线性表来说,没有索引信息
可变参数
- 可变参数概述
定义方法的时候不知道该定义多少个参数 - 格式:
修饰符 返回值类型 方法名(数据类型… 变量名) { } - 注意:
这里的变量其实是一个数组
如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
Objects(对象的工具类)
Arrays(数组的工具类)
Collections(集合的工具类)
Arrays:
public static <T> List<T> asList(T... a)
集合和数组的相互转换:
集合 --> 数组
// Object[] toArray() 一般不用
<T> T[] toArray(T[] arr)
数组 --> 集合
Arrays:
public static <T> List<T> asList(T... a) 视图
集合的嵌套遍历 (二维数组)
JDK5新特性(为了提高编码效率):
a. 泛型
b. 增强for循环
c. 可变参数
d. 自动装箱和自动拆箱
e. 静态导入