Java 8 泛型类型转换失败,因为它通过 java 7

Java 8 generic type conversion fails where as it was passing with java 7

我遇到了这个问题,因此将其作为完整的解决方案发布 -

使用 Java 8,下面的代码将因运行时异常而失败。问题是 getInteger 方法返回的是通用 Integer 类型,而 print 方法需要确切的对象类型。

public static void main(String[] args) {
    print(getInteger());
}

private static <T> T getInteger() {
    return (T)new Integer(10);
}

private static void  print(Object...o1){
    for(Object o: o1){
       System.out.println(o);
    }
}

作为解决方案的一部分,请选择以下任何一项。

在两次调用中中断方法调用和参数传递 –

Integer i = getInteger();

打印(i);

使用 Typed 参数调用打印方法 –

  print(Main.<Integer>getInteger());

希望对您有所帮助。

您的代码混合了类型推断和可变参数。

在 Java 7 中,它起作用是因为没有 target 类型推断:getInteger 调用的类型被解析为 Object,然后将对象装箱到 Object[] 以适应可变参数调用。

对于 Java 8,T 从目标类型推断为 Object[]。由于您在 getInteger 中执行了 unchecked cast,这是完全有效的,并且由方法签名解析规则强制执行,只有在解析失败时才会考虑可变参数而不考虑它。在这里,情况并非如此。

教训:通过执行未经检查的类型转换,您已经放弃了期望类型安全和正确性的权利。你应该做好自己处理的准备。