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

Java泛型-从泛型类型的方法调用特定方法,java,generics,Java,Generics,我试图深入研究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

我试图深入研究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);
}
显然,所有类型在编译时都是已知的。据我所知,Java只保存每个方法的一个编译副本(与C++不同),并且因为没有给出关于参数T的其他约束,所以它被迫调用通用对象实现


我的问题是-有没有任何方法可以调用整数的“Hello Integer”方法而不重载
集合的测试方法,也不使用运行时类型检查?

没有,出于您给出的原因,您不能执行您要求的操作。类型擦除意味着重载对于所有类型变量都被解析一次,并且必须解析为Object。

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

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

重载方法是使用编译时而不是运行时类型信息来解决的。请参阅JLS:

这是无法完成的。由于类型擦除,类型
集合
将解析为类型
集合

请阅读“类型擦除”。谢谢,我熟悉这个概念,我认为这是不可能的,因为我在作品中给出了原因。但是说“这不可能”太容易了——如果是的话,我可以学到一些新的东西。
Object o = new Integer(5);
test(o);  // will output "Hello Object!"