【发布时间】:2009-09-25 12:32:38
【问题描述】:
我静态地重新编译了一个使用泛型的 Java 库,例如 Collection<?>,但发出的 .NET dll 仅使用 Collection,而不使用类型参数。怎么会?
【问题讨论】:
标签: c# java generics type-erasure ikvm
我静态地重新编译了一个使用泛型的 Java 库,例如 Collection<?>,但发出的 .NET dll 仅使用 Collection,而不使用类型参数。怎么会?
【问题讨论】:
标签: c# java generics type-erasure ikvm
Java 泛型由 Java 编译器处理,并在编译时转换为非泛型版本。这与 CLR 对类型参数具有一流支持的 .NET 不同。在字节码级别,ArrayList<T> 将只是一个简单的ArrayList。
引用Java docs:
泛型由 Java 编译器实现为称为 erasure 的前端转换,这是将使用泛型的代码转换或重写为非泛型代码的过程(即映射新的当前 JVM 规范的语法)。 换句话说,这种转换会擦除所有泛型类型信息;尖括号之间的所有信息都将被删除。例如,
LinkedList<Integer>将变为LinkedList。其他类型变量的使用被类型变量的上限替换(例如,Object),并且当生成的代码类型不正确时,插入到适当类型的强制转换。
【讨论】:
objects 转换为特定类型的语法糖。糖很棒,但它本来可以更多。 Mumble 类型等确实增加了价值,所以这并不全是坏事。
javac 将无法检查泛型)。 IKVM 不能使用这些信息吗?