泛型编程
# 简述
定义:一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型
也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,而这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
注意:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为 Object 类型。
泛型还有另外一种称呼我觉得给更为容易理解,即 参数化类型。简单的说就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用、调用时传入具体的类型(类型实参)。
在 Java SE 1.5 之前,没有泛型的情况的下,通过对类型 Object 的引用来实现参数的 "任意化","任意化" 带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
规则限制
泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
泛型的类型参数可以有多个。
泛型的参数类型可以使用 extends super 关键字,习惯上称为 "有界类型"。
泛型的参数类型还可以是通配符类型。
我们来看一段代码(代码没有实际意义,仅仅是演示)
public class Cat {public String getName(){return" 小黑 ";}
}
public class Util<T> {public T getInstance(T t) {return t;}
}
public class Demo1 {public static void main(String[] args) {
// 使用泛型
Util<Cat> util = new Util<>();
util.getInstance(new Cat()).getName();
// 未使用泛型
Demo1 demo1 = new Demo1();
Object ins = demo1.getInstance(new Cat());
if (ins instanceof Cat) {Cat cat=(Cat)ins;
cat.getName();}
}
public Object getInstance(Object obj){return obj;}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
代码解析
很明显我们在未使用泛型的时候需要进行强制类型转换,同时为了保证安全转换还加上对象的类型判断。试想如果需要判断的类型比较多的时候
在使用泛型之后则可以避免上述问题
# 泛型边界
设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在 Java 的泛型中可以指定一个泛型的上限和下限。
泛型的上限,只能接收该类型及其子类,其格式如下
类型名称 <? extends 类> 对象名称
2
3
泛型的下限,只能接收该类型及其父类型,其格式如下
类型名称 <? super 类> 对象名称
2
3
# 小结
泛型的应用其实很多,尤其是在我们封装通用性工具的时候。 Java 编程思想 一书中针对 Java 泛型部分大约占了 10% 的篇幅,可见其重要性