Java 泛型了解么?什么是類型擦除?介紹一下常用的通配符?
Java 泛型(generics)是 JDK 5 中引入的一個(gè)新特性, 泛型提供了編譯時(shí)類型安全檢測機(jī)制,該機(jī)制允許程序員在編譯時(shí)檢測到非法的類型。泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。
Java 的泛型是偽泛型,這是因?yàn)?Java 在編譯期間,所有的泛型信息都會(huì)被擦掉,這也就是通常所說類型擦除 。
List<Integer> list = new ArrayList<>();
list.add(12);
//這里直接添加會(huì)報(bào)錯(cuò)
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.泛型類:
//此處T可以隨便寫為任意標(biāo)識(shí),常見的如T、E、K、V等形式的參數(shù)常用于表示泛型
//在實(shí)例化泛型類時(shí),必須指定T的具體類型
public class Generic<T> {
private T key;
public Generic(T key) {
this.key = key;
}
public T getKey() {
return key;
}
}
如何實(shí)例化泛型類:
Generic<Integer> genericInteger = new Generic<Integer>(123456);
2.泛型接口 :
public interface Generator<T> {
public T method();
}
實(shí)現(xiàn)泛型接口,不指定類型:
class GeneratorImpl<T> implements Generator<T>{
@Override
public T method() {
return null;
}
}
實(shí)現(xiàn)泛型接口,指定類型:
class GeneratorImpl implements Generator<String>{
@Override
public String method() {
return "hello";
}
}
3.泛型方法 :
public static <E> void printArray(E[] inputArray) {
for (E element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
使用:
// 創(chuàng)建不同類型數(shù)組: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3 };
String[] stringArray = { "Hello", "World" };
printArray(intArray);
printArray(stringArray);
4.常用的通配符為: T,E,K,V,?
? 表示不確定的 java 類型
T (type) 表示具體的一個(gè) java 類型
K V (key value) 分別代表 java 鍵值中的 Key Value
E (element) 代表 Element