Java泛型知識總結篇

泛型與內部類

  • 非靜態內部類會自動繼承外圍類泛型參數,對於非靜態內部類,無需再次聲明泛型參數
  • 靜態內部類不會自動繼承外圍類泛型參數(事實上,Node 中的泛型參數 與MyLinkedList 中的 沒有任何聯繫,只是這裏使用相同的符號T而已)
  • 泛型類聲明的泛型參數占主導地位,如泛型類聲明的參數爲 ,則泛型接口的泛型參數也應爲
  • 當泛型類聲明的參數爲 時,泛型接口的參數 能夠不寫;
/**
 * 泛型類聲明的泛型參數占主導地位,如泛型類聲明的參數爲<T>,則泛型接口的泛型參數也應爲<T>;
 * 當泛型類聲明的參數爲<T>時,泛型接口的參數<T>能夠不寫;
 * @param <T>
 */
public class LinkedList<T> implements Iterable {

    @Override
    public Iterator iterator() {
        return null;
    }

    @Override
    public void forEach(Consumer action) {

    }

    @Override
    public Spliterator spliterator() {
        return null;
    }
}

泛型方法

public class GenericMethods{
    public <T> void f(T x) {
        System.out.println(x.getClass().getName());
    }
}

泛型擦除

  • 在泛型代碼內部,沒法得到任何與關泛型參數類型的信息
    List 和 List 在運行時事實上是相同的類型,都是List java

  • 泛型類型參數將擦除到它的第一個邊界node

  • 之因此使用擦除來實現泛型,是爲了遷移兼容性數組

泛型邊界

  • extends對泛型上限進行了限制即T必須是Comparable<? super T>的子類,而後<? super T>表示Comparable<>中的類型下限爲T!

建立泛型類型的對象或者數據

  • new T()在java中沒法實現,能夠經過傳遞一個工廠對象,來建立新的實例,或者本身顯示工廠
class ClassAsFactory<T>{
       T x;
       public ClassAsFactory(Class<T> kind){
            try {
                x = kind.newInstance();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
}
  • 泛型數組建立,也不都能用Object[]強轉,由於類型擦除到第一個邊界,邊界不必定是object
public class ZwbHeap<T extends Comparable<? super T>> {
    private T[] nodes;
    private int size;
    private int capacity = 16;

    public ZwbHeap() {
        // 這樣轉換會失敗
        //nodes = (T[])new Object[capacity+1];
        // 必須這樣寫
        nodes = (T[])new Comparable[capacity+1];
    }
}
相關文章
相關標籤/搜索