为什么Scala的Option 没有直接转换为字节码中的T?

有一件事我不明白斯卡拉,为什么空尽管没有通过替代测试的子类所有的东西。 大概这是为了Java的兼容性,这是好的,我猜 – 但是然后Scala推动Option [T]模式。

这我不明白。 一个选项[T]不给你任何额外的保证(因为每个T是一个事实上的选项无论如何)。 但它也总共有4个州:

val a: Option[String] = null val b: Option[String] = Some(null) val c: Option[String] = None val d: Option[String] = Some("A string") 

这看起来既低效(从字节码pov),甚至可能比痛苦的Java更糟糕。 我的问题是,为什么Scala没有将Option [T]直接翻译成java字节码T,所有与Java代码(使用引用)的接口都必须通过这个Option [T] ,正是这样)。 而且会有一个注释或者什么,因为当一个Scala方法与一个不能是None的T协同工作的时候。

这似乎是最明显的正确的,最安全的和最有效的。

谢谢

有三个可能的原因:

  1. 斯卡拉是一个薄包装,只增加新的东西,他们不想打破。
  2. 他们不想让Java库在使用屁股时感到痛苦,因为所有的参数都是Option [T]而不是T.
  3. 他们不希望使用名称修饰或注释来区分用Scala编写的用Java编写的库(以将方法标记为“不可空的引用”)。

Option的主要原因是支持可以是AnyVal或AnyRef 的Any类型 。 Scala要求AnyVal不能为null 。 这意味着一个类型参数T不能简单地设置为null。 这使得在类库中使用泛型而不使用像Option这样的Scala集合库是很尴尬的。

 val n: Option[Int] = Some(null) // will not compile 

我相信你是正确的, 有很多可能的优化,以消除选项 ,可以消除字节代码级的实际使用类。 有一个选项可以为Scala编译器启用积极的优化,可以做到这一点,但它仍然是很大的工作。

尼尔的回答非常好,但我想补充一点。 Option不是语言的一部分,它只是一个图书馆。 你将如何实现你的建议?

另外,虽然我认为这不是什么大不了的事情,但是可以反映一个Option的类型,如果它只被存储为T就不会是这种情况。

因为Option是一个正常的类型,所以可以扩展特性,使用正常的方法调度逻辑,可以用isInstanceOf等来检查它。

您可能对Kotlin感兴趣,它几乎可以满足您的需求,并且很快就会发布。