为什么在Scala Long中不能像Integer一样初始化为null

时间:2016-08-29 16:22:52

标签: scala null long-integer

我正在创建我的Scala bean,这是一个从YML配置加载的配置。如果没有指定,我想要一个long属性为null,但我面临下面的问题。知道为什么吗?

startOffset: Integer = null
scala> var endOffset: Long = null
<console>:11: error: an expression of type Null is ineligible for implicit conversion
   var endOffset: Long = null
                         ^`

PS:是的,我可以使用Option[Long],但希望清晰,这种方法有什么问题。

3 个答案:

答案 0 :(得分:12)

Scala Long是Java中的文字日期类型,如longInt也是如此。 但是Integer是一个包装类,即java.lang.Integer

如果您想要可以为空的Long值,可以使用java.lang.Long

答案 1 :(得分:9)

IntLong是Scala类型,派生自AnyVal,它不是引用类型(即不是AnyRef)因此无法成为null。另一方面,Integerjava.lang.Integer的别名,它是一种引用类型。

不,它不是疏忽,IntLong是一致的,在Scala中使用null被视为一件坏事,据我了解,{{ 1}}仅用于Java兼容性(即使对于null)以及AnyRef

答案 2 :(得分:3)

在Scala中,类型scala.Null是所有引用类型的子类型(所有类型都继承自scala.AnyRef - 这是java.lang.Object的别名)。这就是为什么你可以在预期的参考类型的任何地方使用null值(类型scala.Null)。

但它不是任何值类型的子类型(从scala.AnyVal继承的类型)。因为scala.Intscala.Longscala.Boolean ...(对应于Java的基元类型)等类型是值类型,所以它们不能为空。

至于你提到的Integer类型:我猜这是java.lang.Integer,它是java.lang.Object(又名scala.AnyRef)的子类型:它是引用类型,所以你可以使用null

使用此Scala类型层次结构图(从the official documentation解除)可能更容易理解: Scala types hierarchy