我静态地重新编译了一个使用泛型的 Java 库,比如Collection<?>
,但发出的 .NET dll 只使用Collection
,而不是类型参数。怎么来的?
问问题
2172 次
1 回答
6
Java 泛型由 Java 编译器处理,并在编译时转换为非泛型版本。这与 CLR 对类型参数具有一流支持的 .NET 不同。在字节码级别,ArrayList<T>
将只是一个简单的ArrayList
.
引用Java 文档:
泛型由 Java 编译器实现为称为擦除的前端转换,这是将使用泛型的代码转换或重写为非泛型代码的过程(即将新语法映射到当前 JVM 规范)。换句话说,这种转换会擦除所有泛型类型信息;尖括号之间的所有信息都将被删除。例如,
LinkedList<Integer>
将成为LinkedList
. 其他类型变量的使用被类型变量的上限(例如,Object
)替换,并且当生成的代码类型不正确时,将插入到适当类型的强制转换。
于 2009-09-25T12:36:04.583 回答