List<String> stringList = new ArrayList<>();
List rawList = stringList;
rawList.add(10);
因此上面的代码编译时会出现警告,但在运行时会中断。 这被认为是在 Java 中删除类型擦除会产生积极影响的情况之一(尽管我理解总的来说我们永远不会删除它)。
我的困惑是,我们在类型擦除发生之前进行类型检查。那么,决定不在编译过程中执行某些后续步骤如何帮助我们找到以前找不到的问题呢?
案例1:
案例2:
但是如果可能的话,为什么不直接做案例 3:
我希望我不明白的地方能被弄清楚。
我的困惑是,我们在类型擦除发生之前进行类型检查......
在此特定示例中,您使用的是原始类型,因此也没有对类型参数进行类型检查。
在Java中添加泛型之前,代码中没有类型参数,但人们仍然希望当时的代码能够编译,因此必须对原始类型禁用某些类型检查。
如果没有类型擦除,原始类型(参数化类型的擦除形式)也不会存在,所以这个问题没有实际意义。
您谈论“删除类型擦除”,就好像类型擦除是该语言的一些附加功能一样。它不是。编译器只是做自泛型存在之前以来一直在做的事情 - 不将局部变量的泛型类型信息发送到类文件中,因为 JVM 不支持泛型类型。
如果 JVMdid 支持泛型类型,将会发生什么变化,那就是可以更早地在运行时抛出异常。假设您要将某个类型为 Object
的变量转换为
List<String>
。假设该变量实际上存储了一个 List<Integer>
。 JVM 可以在运行时检查强制转换是否无效,并在强制转换所在的地方抛出异常。实际上,JVM 无法做到这一点,并且只有当您尝试从 String
中获取 List<Integer>
时才会抛出异常,这可能要晚得多。