日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Effective Java之请不要在新代码中使用原生态类型(二十三)

發布時間:2024/2/28 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的區別

?是無限制通配符類型
下面來看一個例子:

public class test3 {public static void main(String[] args) {Set<String>sets1= new HashSet<String>();test3.add(sets1);test3.add2(sets1);}public static void add(Set s) {s.add(1);}//The method add(capture#1-of ?) in the type Set<capture#1-of ?> is not applicable for the arguments (int)public static void add2(Set<?> s) {s.add(1);} }

這里在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之请不要在新代码中使用原生态类型(二十三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。