【问题标题】:Doesn't IKVM.net support generics (type parameters)?IKVM.net 不支持泛型(类型参数)吗?
【发布时间】:2009-09-25 12:32:38
【问题描述】:

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

【问题讨论】:

    标签: c# java generics type-erasure ikvm


    【解决方案1】:

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

    引用Java docs:

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

    【讨论】:

    • 出于这个原因,我不喜欢 Java 泛型。泛型应该是一个主要特性,但它只不过是避免将objects 转换为特定类型的语法糖。糖很棒,但它本来可以更多。 Mumble 类型等确实增加了价值,所以这并不全是坏事。
    • @Joren,你对泛型过于苛刻了。虽然类型擦除肯定令人失望,但泛型肯定比必须从 Object 强制转换更进一步,因为我们现在能够通过泛型类获得 Java 类型系统的所有编译时保证。
    • 但是泛型信息仍然在编译的类文件中作为元数据可用(否则javac 将无法检查泛型)。 IKVM 不能使用这些信息吗?
    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多