Effective Java(四) 泛型

weixin_34019929發表於2018-02-07

泛型

Tip-23 請不要在新程式碼中使用原生態型別

  • java1.5 版本後 就不要使用 List 而是 使用 List<String> 這種 帶泛型的集合

  • 如果使用原來的集合型別,就失掉了泛型在安全性和表述型方面的所有優勢

  • 原生的List 和 List<Object> 是不同的 List<Object> 並沒有丟掉安全性

  • 假如不確定或不關心實際的型別引數,就可以使用一個問號代理 此乃 無限制萬用字元型別List<?>

  • 加入比對兩個集合中的共同元素的數量-使用無限制萬用字元


static int numElementsInCommon(Set<?> s1,Set<?> s2){
    
    int result = 0 ;
    
    for(Object 01 : s1){
        if(s2.contains(o1)){
            result++;
        }
    }
    
    return result;
    
}
  • 不要在新程式碼中使用原生態型別,這條規則有兩個小小的例外,兩者都源於“泛型資訊可以在執行時被擦除”這一事實。
  • 在類文字中必須使用原生態型別。換句話說 List.class String[].class 和 int.class 都合法,但是List<String>.class 和 List<?>.class 則不合法
  • 由於泛型資訊可以在執行時刪除,因此在引數化型別而非無限制萬用字元上使用instanceof操作符是非法的。
  • 用無限制萬用字元型別代替原生態型別,對instanceof 操作符的行為不會產生影響。

Tip-24 消除非受檢警告

  • 用泛型程式設計時,會遇到許多編譯警告:非受檢強制轉化警告,非受檢方法呼叫警告,非受檢普通陣列建立警告,以及非受檢轉換警告
  • 要儘可能消除一切非受檢警告,如果消除了所有警告,就可以確保程式碼是型別安全的

Tip-25 列表優先於陣列

  • 陣列於泛型相比,有兩個重要的不同點。首先,陣列是協變的,泛型是不可變的
  • 第二大區別,陣列是具體化的。
  • 陣列提供了執行時的型別安全,但是沒有編譯時的型別安全,
  • 如果你發現自己將他們混合起來使用,並且得到了編譯時錯誤或者警告,你的第一反應是用列表代替陣列

Tip-26 優先考慮泛型

  • 看不懂啊

Tip-27 優先考慮泛型方法

  • 靜態工具方法尤其適合於泛型化
  • 泛型化帶來型別安全
  • 泛型方法就像泛型一樣,使用起來比要求客戶端轉換輸入引數並返回值得方法來得更加安全,也更加容易。

Tip-28 利用有限制萬用字元來提升API的靈活性

  • java提供了一種特殊的引數化型別,稱作有限制的萬用字元型別<? Extends E>
  • <? Extends E> 和 <? super E> 逆變和協變
  • PECS 表示 Producer-extends Consumer-super
  • 方法的引數是協變位置,返回值是逆變位置。
  • 要從泛型類取資料時,用extends;
  • 要往泛型類寫資料時,用super;
  • 既要取又要寫,就不用萬用字元(即extends與super都不用)。

Tip-29 優先考慮型別安全的異構容器

  • 看不懂

不在更新Effective 系列 很多東西都是一種感覺 並且多數知識是積累性質的,並沒有在實際開發中使用,在寫的新的一章時發現很多知識不應用就會遺忘,而且簡單的筆記也沒有實質性的幫助,所以永久性停更此係列,以後的文章應該聚焦細節,和實際生產環境的問題。書繼續讀,文章到此處,說不定二讀,三讀,會繼續寫下去。。。。

相關文章