参考:泛型
1 什么是 Java 泛型以及 Java 泛型通配符
1.1 泛型
Java 泛型 generics,可以理解为一种定义的模板,提供编译期类型检测机制,编写模板代码来适应任意类型。
定义泛型方法的规则:
- 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的)。
- 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
- 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
- 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。
所以,
<T>
不能是基本类型,例如int
,因为实际类型是Object
,Object
类型无法持有基本类型。- 无法获取带有泛型的 Class 类型(只能拿到外层的class,与内部泛型无关,即 List 对象的 getClass与 List 的 getClass 相同)。换句话说,所有泛型实例,无论
T
的类型是什么,getClass()
返回同一个Class
实例。 - 通过 getClass 无法判断泛型类型。
无法通过泛型 T 实例化对象。(new T() 是不可以使用的)。要实例化T
类型,必须借助额外的Class<T>
参数:
public Class Demo<T> {
private T t;
public Demo(Class<T> clazz) {
this.t = clazz.newInstance();
}
}
1.2 泛型使用
使用泛型,需要将泛型参数 替换为使用的class类型,比如 List, Set;
- 自动推断,List list = new LinkedList<>();
- 不指定泛型类型,编译器自己自动将 视为