我静态编译了一个使用泛型的Java库,比如Collection<?>
,但是发出的.NET dll只使用Collection
,而不是类型参数。怎么会?
答案 0 :(得分:6)
Java泛型由Java编译器处理,并在编译时转换为非泛型版本。这与.NET不同,其中CLR具有对类型参数的一流支持。在字节码级别,ArrayList<T>
只是一个简单的ArrayList
。
引用Java docs:
泛型由Java编译器实现为名为 erasure 的前端转换,这是将使用泛型的代码转换或重写为非泛型代码的过程(即映射新的当前JVM规范的语法)。 换句话说,此转换会删除所有通用类型信息;尖括号之间的所有信息都将被删除。例如,
LinkedList<Integer>
将变为LinkedList
。其他类型变量的使用将替换为类型变量的上限(例如,Object
),并且当结果代码的类型不正确时,将插入适当类型的强制转换。