標籤:pes att jdk sub ati cep 參數 類型資訊 bsp
在JDK5之後java提供了泛型(Java Genertics),允許在定義類的時候使用類型作為參數。泛型廣泛應用於各類集合中。本文對其以及其用法進行介紹。
1、一個常見的錯誤
下面例子中,用List<Object>類型的參數來接收List<String>。
public class Main { public static void main(String[] args) throws IOException { ArrayList<String> al = new ArrayList<String>(); al.add("a"); al.add("b"); accept(al); } public static void accept(ArrayList<Object> al){ for(Object o: al) System.out.println(o); }}
似乎Object是String的父類,並沒有問題。但是,編譯時間候是不能通過的。報錯如下:
The method accept(ArrayList < Object > ) in the type Main is not applicable for the arguments (ArrayList < String > )
2、List<Object> vs List<String>
原因是java類型擦除機制,在編譯成class檔案時候,編譯器並未把Object和String類型資訊編譯進去。因此為了防止錯誤,編譯器在編譯時間候發現他們不一致就會報錯。
3、萬用字元和無界萬用字元
無界萬用字元List<?> 可接收任何類型
public static void main(String args[]) { ArrayList<Object> al = new ArrayList<Object>(); al.add("abc"); test(al); } public static void test(ArrayList<?> al){ for(Object e: al){//no matter what type, it will be Object System.out.println(e);// in this method, because we don‘t know what type ? is, we can not add anything to al. } }
萬用字元
List< Object > - List can contain Object or it‘s subtypeList< ? extends Number > - List can contain Number or its subtypes.List< ? super Number > - List can contain Number or its supertypes.
java類型擦除(Java Type Erasure Mechanism)