1. 程式人生 > 其它 >java-泛型(基於擦拭法,強轉)

java-泛型(基於擦拭法,強轉)

技術標籤: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