你的论点有缺陷。Kotlin 还没有发布*,Ceylon 刚刚发布了它的第一个版本,我将引用他们的公告中缺少的一个东西:
所以,对不起,但是什么实现证明它是可能的?事实上,我并没有过多关注 Kotlin 的承诺,但Ceylon所承诺的正是 manifest 已经提供的东西,而且是以透明的方式提供的。
但是让我们考虑一下您在问题中描述的问题:
trait Handles[E <: Event] {
def handle(event: E)
}
所以,首先,JVM没有提供任何识别接口或类中类型参数的方法,所以E
不能被JVM检查。但是,您可以存储有关E
implementations 的每个对象中代表的信息Handles
,就像您可以在 Scala 中编写此代码一样:
abstract class Handles[E <: Event : Manifest] {
def handle(event: E)
}
接下来,我们来看看方法handle
。同样,JVM 没有提供在方法定义中使用类型参数的方法。实现它的唯一方法是将handle
接受Object
作为参数:即类型擦除。
交易是这样的:handle
要从 Java 中调用,它必须被类型擦除。而且,如果它被类型擦除,那么它会受到您问题中描述的限制。解决这个问题的唯一方法是放弃 Java 兼容性(顺便说一句,这在 Ceylon 的第一个版本中也不可用)。
是的,根据 Martin Odersky 的说法,Scala 将在 2.10 上进行(某种形式的)具体化。但无论它提供什么(我打赌更透明地使用清单来断言类型相等),这个特殊的限制是 JVM 固有的,如果不放弃 Java 集成就无法克服。
(*) Kotlin 现在有一个演示,它的具体化——到目前为止——只是捆绑清单和 instanceOf 测试的语法糖。它仍然受到 Scala 的所有相同限制。