scala:将null赋给基元

cos*_*osa 4 scala

我试图将null赋给像这样的Double变量:

var foo = 0.0
foo = null
Run Code Online (Sandbox Code Playgroud)

但是,这会给出一个错误,即null不能隐式转换为Double

所以我这样做:

foo = null.asInstanceOf[Double]
Run Code Online (Sandbox Code Playgroud)

但是foo的新值是0.0

如何将值设置为null?

Mic*_*jac 10

你不能.Double是值类型,您只能分配null给引用类型.相反,Scala编译器将替换null为默认值0.0.

请参阅SLS 4.2中的默认值:

default  type
0        Int or one of its subrange types
0L       Long
0.0f     Float
0.0d     Double
false    Boolean
Run Code Online (Sandbox Code Playgroud)

您也不能将Java原语分配给null.虽然Scala Double不是真正的原始(它实际上是Scala中的一个类),但它需要编译为doubleJava字节代码.相反,Option[Double]如果要表示完全缺失的值,则应该使用,并尝试永远不要null在Scala中使用.

  • 我认为这里禁止使用 null 有点夸大其词。Null 的存在是有充分理由的,就像 void 一样。它可以被滥用吗?当然,但条件表达式也可以。我同意那篇关于替代方案的博客文章,我只是不喜欢像“几乎在任何地方使用 null 被认为是不好的做法”这样的模糊陈述。 (2认同)