当涉及类型参数时,为什么 Java 无法找出一些明显的非法强制转换?

问题描述

考虑以下示例:

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 (将#修改为@)