IKVM.net不支持泛型(类型参数)吗?

Car*_*erg 7 c# java generics ikvm type-erasure

我静态地重新编译了一个使用泛型的Java库,比如Collection<?>,但是发出的.NET dll只使用Collection而不是类型参数.怎么会?

Meh*_*ari 6

Java泛型由Java编译器处理,并在编译时转换为非泛型版本.这与.NET不同,其中CLR具有对类型参数的一流支持.在字节码级别,ArrayList<T>只是一个简单的ArrayList.

引用Java文档:

泛型由Java编译器实现为称为擦除的前端转换,这是将使用泛型的代码转换或重写为非泛型代码(即,将新语法映射到当前JVM规范)的过程.换句话说,这种转换会删除所有通用类型信息; 尖括号之间的所有信息都将被删除.例如,LinkedList<Integer>将成为LinkedList.其他类型变量的使用将替换为类型变量的上限(例如,Object),并且当结果代码的类型不正确时,将插入适当类型的强制转换.

  • 因此我不喜欢Java泛型.泛型应该是一个主要特征,但它不仅仅是语法糖,以避免将"对象"转换为特定类型.糖是美妙的,但它本来可以更多.嘟嘟类型实际上增加了价值,所以它并不全是坏事. (4认同)
  • 但是通用信息在编译的类文件中仍然可以作为元数据使用(否则`javac`将无法检查泛型).IKVM无法使用此信息吗? (4认同)