2014-12-07 53 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

不,你不能做你要求的,因为你给的理由。类型擦除意味着所有类型变量的重载解析一次,并且它必须解析为对象。