我静态地重新编译了一个经常使用泛型的Java库,比如 Collection<?> Collection ,不带类型参数。怎么会?
Collection<?>
Collection
Java泛型由Java编译器处理,并在编译时转换为非泛型版本。这与.NET不同,在.NET中,CLR对类型参数具有一流的支持。在字节码级别, ArrayList<T> 将只是一个简单的问题 ArrayList .
ArrayList<T>
ArrayList
引用 Java docs
泛型由Java编译器作为前端转换实现,称为 擦除 ,这是将使用泛型的代码转换或重写为非泛型代码(即,将新语法映射到当前JVM规范)的过程。 换句话说,这种转换会删除所有泛型类型信息;尖括号之间的所有信息都将被删除。 LinkedList<Integer> 将成为 LinkedList . 其他类型变量的使用将替换为类型变量的上限(例如, Object
LinkedList<Integer>
LinkedList
Object