一、聲明中具備一個或多個類型參數的類或接口叫作泛型類、泛型接口(統稱泛型)java
二、每種泛型都帶一個原聲態類型安全
- 即不帶任何實際類型參數的泛型名稱
- List 的原聲態類型是 List
- 以下就是一個原生集合
- 未做限制,集合裏面什麼都能更加
- 編譯期不會報錯,運行下述代碼纔會報錯
- 後續提取使用,類型轉換會有問題
三、不提供類型參數,使用集合類型和其餘泛型也仍然合法code
- 這樣會失掉安全性和表述性全部優點
- java 容許這樣作是爲了和以前代碼保持兼容性!
四、List對象
- List 和List
五、泛型子類型化規則blog
- List 是List 的子類型,和List
- List 會失去安全性,List
- 以下,能夠進行編譯,編譯時會有一條警告(請不要忽視)
六、無限制通配符類型接口
- Set的無限制通配符類型爲:Set(某個類型的集合)
- 無限定通配符在建立對象,建立泛型類、接口、方法都不能使用
- 常常和限定通配符extends,super一塊兒使用
List<?> list2 = new ArrayList<String>();
// 只能增長null ,不能插別的任何元素
list2.add(null);
test(list2);
七、本條的兩個例外:編譯器
類文字中必須使用原生態類型編譯
- 好比 List.class 、String[].class、int.class
- 不可使用:List<String.class>、List<?>.class
- 因爲泛型在運行時會被擦除
參數化類型而非無限制通配符上使用instanceOf 都是非法的class
- 無限制通配符上可使用instanceOf ,效果和原生態類型同樣的
八、總結test
- 不要在新代碼中使用原生態類型
- 原生態代碼僅僅是爲了與引入泛型以前代碼兼容和互用提供的
- Set<Object>是參數化類型,包含任何對象的一個集合(安全)
- Set<?>通配符類型,只包含某種未知對象的集合(安全)
- Set 原生態類型,脫離了泛型(不安全)