Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
Java 的泛型是伪泛型,这是因为 Java 在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除 。
1 2 3 4 5 6 7 8 9 10 11
| List<Integer> list = new ArrayList<>();
list.add(12);
list.add("a"); Class<? extends List> clazz = list.getClass(); Method add = clazz.getDeclaredMethod("add", Object.class);
add.invoke(list, "kl");
System.out.println(list);
|
泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
1.泛型类
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
public class Generic<T> {
private T key;
public Generic(T key) { this.key = key; }
public T getKey() { return key; } }
|
如何实例化泛型类:
1
| Generic<Integer> genericInteger = new Generic<Integer>(123456);
|
2.泛型接口
1 2 3
| public interface Generator<T> { public T method(); }
|
实现泛型接口,不指定类型:
1 2 3 4 5 6
| class GeneratorImpl<T> implements Generator<T>{ @Override public T method() { return null; } }
|
实现泛型接口,指定类型:
1 2 3 4 5 6
| class GeneratorImpl implements Generator<String>{ @Override public String method() { return "hello"; } }
|
3.泛型方法
1 2 3 4 5 6
| public static <E> void printArray(E[] inputArray) { for (E element : inputArray) { System.out.printf("%s ", element); } System.out.println(); }
|
使用:
1 2 3 4 5
| Integer[] intArray = { 1, 2, 3 }; String[] stringArray = { "Hello", "World" }; printArray(intArray); printArray(stringArray);
|
常用的通配符为: T,E,K,V,?
- ? 表示不确定的 java 类型
- T (type) 表示具体的一个 java 类型
- K V (key value) 分别代表 java 键值中的 Key Value
- E (element) 代表 Element