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>的测试方法,也不使用运行时类型检查?

这是不可能做到的。由于类型纠删,类型Collection<T>将解析为类型Collection<Object>。通用方法的擦除

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

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

不,你不能做你要求的事情,因为你给出的原因。类型擦除意味着对所有类型变量的重载只解析一次,并且必须解析为 Object。

最新更新