請不要在新代碼中使用原生類型(23)

一、聲明中具備一個或多個類型參數的類或接口叫作泛型類、泛型接口(統稱泛型)java

  • List
  • 每組泛型定義一組參數化的類型

二、每種泛型都帶一個原聲態類型安全

  • 即不帶任何實際類型參數的泛型名稱
  • 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 原生態類型,脫離了泛型(不安全)

相關文章
相關標籤/搜索