2017-04-18 36 views
0

我正在閱讀泛型中刪除類型的概念。在執行下面的代碼時,我感到困惑。在泛型混淆中進行類型刪除

public class CollectionsWild { 
    void Test(Collection<?> t){ 
     System.out.println("Collection"); 
    } 

    void Test(List<Integer> t){ 
     System.out.println("List"); 
    } 


    public static void main(String[] args) { 
     CollectionsWild o = new CollectionsWild(); 
     o.Test(new ArrayList<String>()); 
    } 

} 

作爲每類型擦除的概念,「List<Integer> t」被轉換爲「列表T」中的字節碼。那麼爲什麼我的方法測試調用哪個以Collection作爲參數。它應該調用帶有List的方法作爲參數

+0

謝謝,但你給的鏈接與我所要求的無關。 –

回答

2

這與擦除無關。重載解析在編譯時完成。只有一個超載匹配ArrayList<String>,那就是所選的那個。如果有多於一場比賽,則選擇最具體的比賽。

在使用相同類型擦除重載的情況下,即使考慮重載解析,類型的定義也不會編譯。

2

方法選擇是編譯時的事情。發生類型擦除之後。正如你可以看到JLS§15.12.2,泛型類型參數認爲:

決定的方法是否適用的意志,在通用的方法(§8.4.4)的情況下,需要的類型參數的分析。