effective java 讀書筆記---第五章 泛型

23.請不要在新代碼中使用原生態類型

24.消除非受檢警告
非受檢警告範圍應該儘可能的小,不要在方法級上增加SuppressWarnings 註解,需要將這個註解添加到對應的局部變量上去,添加這個註解時需要寫明註釋,解釋爲何是安全的

25.列表優先於數組
數組是協變的,如果Sub 是Super 的子類型,那麼 Sub[]就是 Super 的子類型,因此如下代碼在編譯期是合法的

Object[] objectArray = new Long[1];
objectArray[0] = "123,456";

但在運行期會拋出ArrayStoreException,而列表則不存在這個問題,List< Object>不會是 List< Long>的超類,類似於上面的代碼使用 List 時是非法的
數組域列表的第二大區別,數組是具體化的,數組在運行期纔會檢查它們元素類型約束,而泛型只在編譯時強化它們的類型信息,並在運行期丟棄或者擦除它們的元素類型信息(instance of 不能區分不同元素對象信息的兩個 LIst).擦除就是使泛型可以與沒有使用泛型的代碼隨意進行復用
數組和泛型不能很好的進行混用,創建泛型,參數化類型或者類型參數的數組是非法的,例如:new List< E>[],new List< String>[] ,和 new E[],這些在編譯時都會導致泛型數組創建錯誤,只能創建 new List[],因爲泛型數組不是類型安全的,泛型必須保證類型安全.
因此當可變參方法與泛型集合使用時會出現警告,因爲可變參方法被調用時,會創建一個數組來存放參數.
因此應該優先使用 List< E>而不是數組類型 E[],這樣可能會損失性能或者簡潔性,但是卻有更高的安全性與複用性

26.優先考慮泛型
不能直接創建泛型數組,但是可以使用 Object 數組強行轉化成泛型數組(E[])new Object[1] 此時必須確保類型安全,也可以直接使用 Object 數組,但是將 Object 數組中的值強行轉換成 E(泛型)
E extends XX 限制泛型必須是 XX 的子類型

27.優先考慮泛型方法
泛型方法就像泛型一樣,使用起來比要求客戶端轉換輸入參數並返回值得方法來得更加安全,也更加容易.就像類型一樣,應該確保新方法不需要轉換就能使用,這通常意味着要將它們泛型化.

28.利用有限制的通配符來提升 api 的靈活性
使用 < ? extends E> < ? super E>來提升泛型方法的實用性(可以對子類有效,可以返回父類)

29.優先考慮類型安全的異構容器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章