我对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一起工作时,会有一个注释或其他东西。
这似乎是最明显正确,最安全和最有效的。
由于
答案 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)
有三个可能的原因:
答案 3 :(得分:0)
因为Option
是普通类型,它可以扩展特征,使用普通方法调度逻辑,您可以使用isInstanceOf
等来检查它。
您可能对Kotlin感兴趣,does pretty much what you want并且应该很快就会发布。