泛型

泛型是通过 Type erasure 在 Java 中实现的,这意味着在运行时期间,泛型类的实例化中指定的 Type 信息不可用。例如,语句 List<String> names = new ArrayList<>(); 生成一个列表对象,在运行时无法从中恢复元素类型 String。但是,如果列表存储在 List<String> 类型的字段中,或者传递给此类型的方法/构造函数参数,或者从该返回类型的方法返回,则可以在运行时通过 Java 恢复完整类型信息反射 API。

这也意味着当转换为泛型类型(例如:(List<String>) list)时,强制转换是未经检查的强制转换。因为参数 <String> 被擦除,所以 JVM 无法检查从 List<?>List<String> 的转换是否正确; JVM 只能在运行时看到 ListList 的强制转换。