Java 8泛型类型转换在使用java 7传递时失败

Moh*_*nan -2 java java-8

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

使用Java 8,以下代码将失败并出现运行时异常.问题是getInteger方法返回一个通用的Integer类型,print方法需要精确的Object Type.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 9

您的代码将类型推断与varargs混合在一起.

在Java 7中,它起作用,因为没有目标类型推断:getInteger调用的类型被解析为just Object,然后将对象装入一个Object[]以适合varargs调用.

使用Java 8,T从目标类型推断为Object[].既然你执行一个未经检查的投getInteger,这是完全有效的,并通过方法签名解析规则,将考虑可变参数只有当解析失败,而不考虑使用授权.在这里,情况并非如此.

经验:通过执行未经检查的类型转换,您放弃了期望类型安全性和正确性的权利.你应该准备好自己照顾它.