java-泛型(基於擦拭法,強轉)
阿新 • • 發佈:2021-01-22
技術標籤:java
泛型是一種類似”模板程式碼“的技術,不同語言的泛型實現方式不一定相同。
Java語言的泛型實現方式是擦拭法(Type Erasure)。
所謂擦拭法是指,虛擬機器對泛型其實一無所知,所有的工作都是編譯器做的。
例如,我們編寫了一個泛型類Pair,這是編譯器看到的程式碼:
public class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() {
return first;
}
public T getLast() {
return last;
}
}
而虛擬機器根本不知道泛型。這是虛擬機器執行的程式碼:
public class Pair {
private Object first;
private Object last;
public Pair(Object first, Object last) {
this.first = first;
this .last = last;
}
public Object getFirst() {
return first;
}
public Object getLast() {
return last;
}
}
編譯器將視為Object,根據實現安全強轉
使用泛型的時候,我們編寫的程式碼也是編譯器看到的程式碼:
Pair<String> p = new Pair<>("Hello", "world");
String first = p.getFirst();
String last = p.getLast();
而虛擬機器執行的程式碼並沒有泛型:
Pair p = new Pair("Hello", "world");
String first = (String) p.getFirst();
String last = (String) p.getLast()
侷限
不能是基本型別,例如:int;
不能獲取帶泛型型別的Class,例如:Pair.class;
不能判斷帶泛型型別的型別,例如:x instanceof Pair;
不能例項化T型別,例如:new T()。
泛型方法要防止重複定義方法,例如:public boolean equals(T obj);
子類可以獲取父類的泛型型別。
Extends and super萬用字元 - PECS原則
?extends T - only get
? super T - only write