Scala 中缺乏具体化的泛型是这门语言最困扰我的地方,因为 simple things不使用复杂的结构就无法实现。
Kotlin 和 Ceylon 都支持物化泛型,因此绝对可以在 JVM 之上这样做。在 past据说如果不更改 JVM,Scala 就无法支持它们,但现在 Scala 2.10 是 rumored对物化的支持有限。所以我的问题是:
最佳答案
你的论点有缺陷。 Kotlin 还没有发布*,Ceylon 刚刚发布了它的第一个版本,我将引用 their announcement 中缺少的一个东西。 :
- reified generics
所以,对不起,但是 什么 实现证明这是可能的?事实上,我并没有过多关注 Kotlin 的前景,但 Ceylon 所 promise 的正是 manifest 已经提供的东西,而且是以透明的方式提供的。
但是让我们考虑一下您在问题中描述的问题:
trait Handles[E <: Event] {
def handle(event: E)
}
所以,首先,JVM没有提供任何识别接口(interface)或类中类型参数的方法,所以E
不能被JVM检查。但是,您可以在实现 Handles
的每个对象中存储有关 E
代表什么的信息,就像您可以在 Scala 中编写此代码一样:
abstract class Handles[E <: Event : Manifest] {
def handle(event: E)
}
接下来,我们来看看方法handle
。同样,JVM 没有提供在方法定义中使用类型参数的方法。实现这一点的唯一方法是让 handle
接受 Object
作为参数:即类型删除。
这里是交易:为了使 handle
可以从 Java 中调用,它必须被类型删除。而且,如果它被类型删除,那么它会受到您问题中描述的限制。解决这个问题的唯一方法是放弃 Java 兼容性(顺便说一下,这在 Ceylon 的第一个版本中也不可用)。
是的,根据 Martin Odersky 的说法,Scala 将在 2.10 上进行(某种形式的)具体化。但无论它提供什么(我打赌更透明地使用 list 来断言类型相等),这个特殊的限制是 JVM 固有的,如果不放弃 Java 集成就无法克服。
(*) Kotlin 现在有一个演示,它的具体化——到目前为止——只是捆绑 list 和 instanceOf 测试的语法糖。它仍然受到 Scala 的所有相同限制。
https://stackoverflow.com/questions/8605329/