2014-12-07 54 views
5

我嘗試深入研究Java泛型,並遇到以下示例代碼描述的問題。Java泛型 - 調用通用類型的特定方法

public static void test(Object o) { 
    System.out.println("Hello Object!"); 
} 

public static void test(Integer i) { 
    System.out.println("Hello Integer!"); 
} 

public static <T> void test(Collection<T> col) { 
    for (T item : col) { 
     System.out.println(item.getClass().getSimpleName()); 
     test(item); 
    } 
} 

public static void main (String[] args) throws java.lang.Exception 
{ 
    Collection<Integer> ints = new ArrayList<>(); 
    ints.add(1); 
    test(ints); 
} 

樣品的輸出是

Integer 
Hello Object! 

所有類型都在編譯時已知明顯。據我所知,Java只保存每個方法的單個編譯副本(與C++不同),並且因爲沒有給出有關參數T的其他約束,所以它被迫調用通用對象實現。

我的問題是 - 有什麼辦法可以調用整型的「Hello Integer」方法,而不用重載Collection<Integer>的測試方法,也不需要使用運行時類型檢查?

+0

閱讀'type erasure'。 – bmargulies 2014-12-07 04:02:50

+0

謝謝,我對這個概念很熟悉,我認爲這是不可能的,因爲我在OP中給出的理由。但是說「這不可能」太容易了 - 如果是這樣,我可以學到新的東西。 – Danstahr 2014-12-07 04:12:43

回答

1

不,你不能做你要求的,因爲你給的理由。類型擦除意味着所有類型變量的重載解析一次,並且它必須解析爲對象。