我遇到了这个问题,因此将其作为完整解决方案发布 -
使用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)
您的代码将类型推断与varargs混合在一起.
在Java 7中,它起作用,因为没有目标类型推断:getInteger调用的类型被解析为just Object,然后将对象装入一个Object[]以适合varargs调用.
使用Java 8,T从目标类型推断为Object[].既然你执行一个未经检查的投中getInteger,这是完全有效的,并通过方法签名解析规则,将考虑可变参数只有当解析失败,而不考虑使用授权.在这里,情况并非如此.
经验:通过执行未经检查的类型转换,您放弃了期望类型安全性和正确性的权利.你应该准备好自己照顾它.
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |