1. 程式人生 > >Java 程式碼複用 —— 泛型

Java 程式碼複用 —— 泛型

1. 型別擦除(type erasure)

  • 為什麼說Java的泛型是偽泛型呢?因為,在編譯期間,所有的泛型資訊都會被擦除掉。
    • Java中的泛型基本上都是在編譯器這個層次來實現的。在生成的Java位元組碼中是不包含泛型中的型別資訊的。使用泛型的時候加上的型別引數,會在編譯器在編譯的時候去掉。這個過程就稱為型別擦除。
  • 如在程式碼中定義的List<object>List<String>等型別,在編譯後都會程式設計List。JVM看到的只是List,而由泛型附加的型別資訊對JVM來說是不可見的。Java編譯器會在編譯時儘可能的發現可能出錯的地方,但是仍然無法避免在執行時刻出現型別轉換異常的情況

    。型別擦除也是Java的泛型實現方法與C++模版機制實現方式之間的重要區別。

    List<String> list1 = new ArrayList<>();
        // list1.getClass() ⇒ class java.util.ArrayList
    List<Integer> list2 = new ArrayList<>();
        // list2.getClass() ⇒ class java.util.ArrayList
    list1.getClass() == list2.getClass();
        // true
  • Java 泛型:型別不安全?

    List<Integer> list3 = new ArrayList<>();
    list3.add(100);
    list3.getClass().getMethod("add", Object.class).invoke(list3, "abc");
            // 通過反射,字串形式的 abc 新增到了 list3 中了;