generics - Scala 2.10 中的具体泛型

Scala 中缺乏具体化的泛型是这门语言最困扰我的地方,因为 simple things不使用复杂的结构就无法实现。

Kotlin 和 Ceylon 都支持物化泛型,因此绝对可以在 JVM 之上这样做。在 past据说如果不更改 JVM,Scala 就无法支持它们,但现在 Scala 2.10 是 rumored对物化的支持有限。所以我的问题是:

  • 我们可以期待 Scala 2.10 中的具体化,例如,我是否能够实现 generic trait multiple times ?.到底有多大限制?
  • 如果 Scala 2.10 的具体化结果比 Kotlin 更有限和 Ceylon .这是为什么呢?

最佳答案

你的论点有缺陷。 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/

相关文章:

android - 无法设置约束组的可见性

function - Kotlin:你可以为可变参数使用命名参数吗?

class - 我无法从 Kotlin 的嵌套类中联系到任何类成员

kotlin - Kotlin 中 with 和 run 的区别

android - Kotlin : safe lambdas (no memory leak)?

android - IllegalArgumentException : savedInstance

android - android 上的 Kotlin : Cannot find main mer

kotlin - 如果可空类型为空,我如何运行代码块?

java - 在使用 Kotlin 的方法中抛出异常

gradle - 为什么更新 Gradle 到 3.1.0 后显示 "3rd-party Gradl