神價手慢無:恆都白水羊肉 1.6 斤 48.76 元探底(京東 150 元 / 斤)
阿新 • • 發佈:2022-01-12
1.術語介紹
引數化的型別 | List<String> |
實際型別引數 | String |
泛型 | List<E> |
形式型別引數 | E |
無限制萬用字元型別 | List<?> |
原生態型別 | List |
有限制類型引數 | <E extends Number> |
遞迴型別限制 | <T extends Comparable> |
有限制萬用字元型別 | List<? extends Number> |
泛型方法 | static <E> List<E> asList(E[] a) |
型別令牌 | String.class |
2.為什麼使用泛型而不要使用原生態型別
- 直接地說,不使用泛型會出現執行時異常,而使用泛型,有問題編譯時就會被編譯器發現。
- Java1.5版本之前,沒有泛型,從集合中讀取的每一個物件都必須進行轉換
- 如果一不小心插入了型別錯誤的物件,編譯時不會被發現,執行時轉換會出錯
//使用泛型,告訴編譯器list1裡只能放入String型別 List<String> list1 = new ArrayList<>(); list1.add(new String("abc"));//不報錯 list1.add(new Integer(1));//編譯器報錯,編譯不通過 //使用原生態型別,List list2 = new ArrayList(); list2.add(new String("abc"));//不報錯 list2.add(new Integer(1));//不報錯
如果你使用了泛型,就等於告訴編譯器,我這個集合就放這種型別,你給我盯著點,如果我忘了,往裡面新增別的型別你要阻止我!
一句話,可以讓編譯器幫你檢查型別錯誤。
因此,我們宣告集合時要儘量使用泛型,能最大地減少型別錯誤。(新寫的程式碼都要用泛型)
那麼為什麼編譯器不強制我們使用泛型呢?原因是,泛型是jdk1.5才提出來的,允許原生態和泛型並存只是為了相容引入泛型之前的程式碼,畢竟到jdk1.5時已經有很多專案在使用Java了。
3.有哪些地方必須使用原生態呢
- 在類型別中必須使用原生態
- List<String.class>、List<?>.class,都是不合法的;List.class、String[].class、int.class,是合法的
- 關鍵字 instanceof
- o instanceof Set 合法;
總之,使用原生態型別在執行時會導致異常,因此在新程式碼中要使用泛型
4.消除非受檢警告
消除所有警告,就可以確保程式碼是型別安全的,意味著執行時不會出現ClassCastException。
# 會有警告 List<Monkey> monkeys1 = new ArrayList(); # 消除警告 List<Monkey> monkeys2 = new ArrayList<Monkey>(); #或者如下 List<Monkey> monkeys3 = new ArrayList<>();
- 如果無法消除警告,同時可以證明引起警告的程式碼是型別安全的,可以用 @SuppressWarning("unchecked") 註解來禁止這條警告
但是請不要隨便用,你確保真的沒有型別安全問題時才用,不然執行時還是會報錯;
如果你忽略警告,也不檢查型別問題也不加註解,那麼新出現的警告就會淹沒在眾多錯誤警告中
- SuppressWarning 可以用在任何力度的級別中,從區域性變數到整個類,但你應該儘量用在可能小的範圍內