问题描述
考虑以下示例:
public class Example {
public static <T> void f(T obj) {
Integer i = (Integer) obj; // runtime error
}
public static void main(String[] args) {
f("hello");
}
}
Java 无法确定第 3 行中的强制转换在编译时是非法的,有什么原因吗?当然,由于类型擦除,运行时函数的签名将是 f(Object obj)
,但在我看来,在编译时它有足够的信息来捕获错误。
将此与案例进行比较:
List<String> ls = new ArrayList<>();
ls.add(42); // compile-time error
ls.add("foo");
Integer i = ls.get(0); // compile-time error
其中涉及类型参数但在编译时成功检测到错误。
如果答案是“编译器不够聪明”,那么有什么理由(为了向后兼容?)为什么不能让它变得更聪明?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)