导读:
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦除掉,这就是通常所说的类型擦除
List<Integer> list = new ArrayList<>();
list.add(111);
list.add("abc"); //这里会报错
Class<? extends List> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add",Object.class);
add.invoke(list,"abc"); //但是可以通过反射添加
System.out.println(list);
所以说,泛型只在编译阶段有效。
泛型一般有三种使用方式:泛型类、泛型接口、泛型方法
1.泛型类:
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{
private T key;
public Generic(T key){
this.key = key;
}
public T getKey(){
return key;
}
}
如何实例化泛型类:
Generic<Integer> genericInteger = new Generic<Integer>(123456);
2.泛型接口
public interface Generator<T>{
public T method();
}
实现泛型接口,不指定类型:
class GenImpl<T> implements Generator<T>{
@Override
public T method(){
return null;
}
}
实现泛型接口,指定类型:
class GenImpl<T> implements Generator<String>{
@Override
public String method(){
return null;
}
}
3.泛型方法
public static <E> void printArray(E[] array){
for (E ele: array){
System.out.print(ele);
}
}
使用:
//创建不同类型数组
Integer[] intArray = {1, 2, 3};
String[] strArray = {"Hello","World"};
//调用什么的方法
printArray(intArray);
printArray(strArray);
常用的通配符为:T, E, K, V, ?
- ? 表示不确定的类型
- T(type) 表示具体的一个类型
- K和V分别表示键值对中的key和value
- E (element) 代表Element