1. 程式人生 > 資訊 >神價手慢無:恆都白水羊肉 1.6 斤 48.76 元探底(京東 150 元 / 斤)

神價手慢無:恆都白水羊肉 1.6 斤 48.76 元探底(京東 150 元 / 斤)

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 可以用在任何力度的級別中,從區域性變數到整個類,但你應該儘量用在可能小的範圍內
stay hungry stay foolish!