我对类型擦除的 Java 泛型的限制越来越感到沮丧。我想知道是否有一个自定义 Java 编译器可以提供完整版本的泛型,而没有与类型擦除相关的怪癖?
这不仅仅是需要更改编译器。 我认为还需要以与 JVM 规范不兼容的方式更改 JVM 实现,并以与当前 API 不兼容的方式更改 Java 类库。
例如,
checkcast
指令的语义发生了显着变化,Object.getClass()操作返回的对象也必须发生变化。
简而言之,最终结果将不再是“Java”,并且绝大多数 Java 开发人员不会感兴趣。 使用新工具/JVM/库开发的任何代码都会受到污染。
现在,如果 Sun/Oracle 提议/进行此更改...那将会很有趣。
Scala(一种在 JVM 之上运行的语言)可以让您使用强大的 manifests 概念来解决类型擦除问题,它本质上为您提供了 具体化类型。
更多信息:http://www.scala-blogs.org/2008/10/manifests-reified-types.html
除非你断言 JDK 编译器没有正确实现该语言,否则这个问题毫无意义。任何不遵守相同规则的编译器都不是 Java 编译器,因此没有人推荐使用它。
这是可行的,但我不知道还有谁做到了。 需要对 javac 进行重大重写,以使其在需要时实例化泛型(为每个实例化创建一个新的 .class 文件),但其他方面应该相当简单。 它甚至可以添加对使用原始类型作为泛型类型参数的支持。