【发布时间】:2016-05-27 22:22:50
【问题描述】:
我正在寻找一种基于 JVM 的语言,它始终在运行时“记住”类型,除非:
- 编译器发现擦除不会中断执行或与工作流无关
- 用户手动声明要删除的类型。
到目前为止,我只尝试了 scala,它只会在源代码中声明时禁用类型擦除,这不是我想要的,因为它需要大量样板代码来实现,并且当前的实现仍然有很多问题(例如在 Scala 中,类型标签是严格不变的,禁止在协变或逆变情况下使用)。
这种语言存在吗?
【问题讨论】:
-
我认为还没有。保存泛型的自然方法是将它们存储在注释中,但是有很多东西不能被注释(或者至少在 Java 8 之前不能),所以直到最近,这还行不通.请注意,大多数类型 在运行时保留。否则动态方法分派将不起作用。实际上,没有保留的是类型构造函数的类型参数。有些人可能会争辩说应该是这样。例如。 Haskell 编译器通常会删除 所有 类型(不仅仅是泛型),而且 Haskell 并不完全知道打字松散。
-
Kotlin 在内联函数中具体化了泛型。所以仅在某些有限的情况下。