Effective Java之请不要在新代码中使用原生态类型(二十三)
1.泛型與原生態類型的概念
泛型就是帶一個或多個類型參數E的類或者接口,而原生態類型是不帶任何實際類型的泛型,例如List是原生態類型,List < String >或者List< E >是泛型。
2.泛型的作用
泛型是在jdk1.5之后添加的。
舉個例子:
public class test {public static void main(String[] args) {ArrayList list = new ArrayList();list.add(new Integer(2));String s = (String) list.get(0);} }就會在運行時拋出
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringat wqeqw.test.main(test.java:10)然而添加了泛型
public class test {public static void main(String[] args) {ArrayList<String> list = new ArrayList();list.add(new Integer(2));//不用顯式聲明類型轉換String s = list.get(0);} }就會在編譯時拋出
The method add(String) in the type ArrayList<String> is not applicable for the arguments (Integer)而且不用顯式聲明類型轉換。
總結:泛型的作用是將jdk1.5以前在運行期間容易發生問題的強制類型轉換問題提前到編譯期間檢查。
3.List<Object>和List的區別
先看一個例子:
public class test2 {public static void main(String[] args) {List<String>lists= new ArrayList<String>();test2.add(lists, 123);String string = lists.get(0);}public static void add(List list,Object o) {list.add(o);} }這里依然會發生強制轉換的問題,原因是List< String >是List的子類,借此,可以通過多態這種小把戲,能讓List< String >做出“出格”的行為。
而List< String >并不是List< Object >的子類,可以在編譯期間就檢查,防止做出小把戲。
//將List換成List<Object> public static void add(List<Object> list,Object o) {list.add(o);}就會在編譯期間發現小把戲:
The method add(List<Object>, Object) in the type test2 is not applicable for the arguments (List<String>, int)總結:List原生類型避免了類型檢查,失去安全性,后者明確告訴編譯器能夠持有任何類型的對象。
4.List<?>和List的區別
?是無限制通配符類型
下面來看一個例子:
這里在List< String >中添加Integer元素,add2方法出現編譯錯誤。
這里實際上耍的小把戲,跟上面的例子一樣,List< ? >在這里做的事情是不能將任意元素(除了null)添加到List< ? >中,這就杜絕了小把戲的出現。
但是這樣的編譯錯誤讓人無法接受,無法將任意元素添加到List< ? >中,那要他有何用,于是有限制的通配符在這里就派上了用場。
總結:這里List< ? >無限制通配符的作用僅僅是防止強制類型轉換問題的發生,并沒有實際的作用。
5.適合原生態類型的情況
1.規范中要求:在類文字中必須用原生態類型List
比如List.class
而不能List< String >.class
2.由于泛型類型在運行時是可以擦除的,所以在xx instanceof List這樣的語句中是沒有問題的,變成xx instanceof List<?>反而是多余的。
總之,原生態類型只是為了與引入泛型之前的遺留代碼進行兼容而提供的,除了類文字,instance兩種情況,否則不要在新代碼中國使用原生態類型。
總結
以上是生活随笔為你收集整理的Effective Java之请不要在新代码中使用原生态类型(二十三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Effective Java之使可变性最
- 下一篇: Effective Java之消除受检警