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,这是完全有效的,并且由方法签名解析规则强制执行,只有在解析失败时才会考虑可变参数而不考虑它。在这里,情况并非如此。
教训:通过执行未经检查的类型转换,您已经放弃了期望类型安全和正确性的权利。你应该做好自己处理的准备。
我遇到了这个问题,因此将其作为完整的解决方案发布 -
使用 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,这是完全有效的,并且由方法签名解析规则强制执行,只有在解析失败时才会考虑可变参数而不考虑它。在这里,情况并非如此。
教训:通过执行未经检查的类型转换,您已经放弃了期望类型安全和正确性的权利。你应该做好自己处理的准备。