
Java 泛型
泛型
从 JDK 5.0 开始,Java 引入“参数化类型”的概念,这种参数化类型称为“泛型”。泛型是将数据类型参数化,即在编写代码时将数据类型定义成参数,这些类型参数在使用之前再进行指明。泛型提高了代码的重用性,使得程序更加灵活、安全和简洁。
泛型定义
public class ClassName<T> {
public T data;
public void setData(T data) {
this.data = data;
}
public T getData() {
return this.data;
}
}
通配符
定义一个方法时,若该方法的参数需要使用泛型,但类型参数是不确定的,则可以使用通配符 "?" 来表示一个未知类型,从而解决类型被限制、不能动态根据实例进行确定的缺点。
public class ClassName {
public function(List<?> array) {
// Do someting...
}
}
有界类型
泛型的类型参数可以是各种类型,但有时候需要对类型参数的取值进行一定程度的限制,以保证类型参数在指定范围内。有界类型分为两种
- 使用 extends 关键字声明类型参数的上界
public class ClassName<T extends Number> { // 限制类型为 Number 类及其子类
// ...
}
- 使用 super 关键字声明类型参数的下界
public class ClassName<T super String> { // 限制类型为 String 类本身或其父类 Object
// ...
}
泛型的限制
- 泛型的类型参数只能是类类型,不能是简单类型
- 定义泛型时,类型参数只是占位符,不能直接实例化。比如
new T()
是错误的 - 不能实例化泛型数组。