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