Java Generics - 从泛型类型调用特定方法

时间:2014-12-07 03:47:20

标签: java generics

我尝试深入研究Java Generics,并且遇到了以下示例代码所描述的问题。

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的其他约束,所以它被迫调用通用的Object实现。

我的问题是 - 有没有办法打电话给&#34; Hello Integer&#34;整数的方法没有重载Collection<Integer>的测试方法而不使用运行时类型检查?

3 个答案:

答案 0 :(得分:3)

无法做到。由于类型擦除类型Collection<T>将被解析为Collection<Object>类型。 Erasure of Generic Methods

答案 1 :(得分:2)

您可以在没有泛型的情况下观察相同的行为。

Object o = new Integer(5);
test(o);  // will output "Hello Object!"

使用编译时而非运行时类型信息解析重载方法。请参阅JLS:https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.9

答案 2 :(得分:1)

不,由于你给出的理由,你无法做你要求的事。类型擦除意味着对所有类型变量解决一次重载,并且必须解析为Object。