java類型擦除(java type erasure mechanism)

在JDK5以後java提供了泛型(Java Genertics),容許在定義類的時候使用類型做爲參數。泛型普遍應用於各種集合中。本文對其以及其用法進行介紹。

1. 一個常見的錯誤

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的父類,並無問題。可是,編譯時候是不能經過的。報錯以下:html

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類型信息編譯進去。所以爲了防止錯誤,編譯器在編譯時候發現他們不一致就會報錯。java

3. 通配符和無界通配符

(1) 無界通配符

List<?> 可接收任何類型。app

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. 
        }
    }

(2)通配符

List< Object > - List can contain Object or it's subtype
 
List< ? extends Number > -  List can contain Number or its subtypes.
List< ? super Number > - List can contain Number or its supertypes.
轉自個人博客園( http://www.cnblogs.com/qins/p...
相關文章
相關標籤/搜索