为什么Scala的Option [T]不直接转换为字节码中的T?

时间:2011-11-30 06:47:45

标签: scala

我对Scala不了解的一件事是,尽管Null没有通过替换测试,但为什么Null将所有内容都包含在内。据推测这是为了兼容Java,我想这很好 - 但随后Scala推动了Option [T]模式。

这个我不明白。 Option [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代码(使用引用)的接口都必须通过这个选项[T](这真的,正是它是什么)。当一个Scala方法与一个不能为None的T一起工作时,会有一个注释或其他东西。

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

由于

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:4)

Neil的答案非常好,但我想补充另一个因素。 Option不是语言的一部分,它只是一个库。你会如何实现你的建议?

此外,虽然我不认为这是一个很大的交易,但您可以反映Option的类型,如果它只是存储为T则不会是这种情况

答案 2 :(得分:2)

有三个可能的原因:

  1. Scala是一个很薄的包装器,它只会添加新东西,而且他们不想破坏它。
  2. 他们不想让Java库在使用中变得很麻烦,因为所有参数都是Option [T]而不是T。
  3. 他们不希望使用名称修改或注释来区分用Scala编写并用Java编写的库(将方法标记为采用“非可空引用”)。

答案 3 :(得分:0)

因为Option是普通类型,它可以扩展特征,使用普通方法调度逻辑,您可以使用isInstanceOf等来检查它。

您可能对Kotlin感兴趣,does pretty much what you want并且应该很快就会发布。