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

Why in Scala Long cannot in initialized to null whear as Integer can

我正在创建我的 Scala bean,它是一个要从 YML 配置加载的配置。如果未指定,我希望 long 属性 为空,但我面临以下问题。知道为什么吗?

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],但想要清楚,这种方法有什么问题吗?

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

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

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

不,这不是疏忽,IntLong 是一致的,在 Scala 中使用 null 被认为是一件坏事,据我了解,null 的存在仅仅是为了 Java 兼容性(甚至 AnyRef)以及 Integer.

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

但是,它不是任何值类型(继承自 scala.AnyVal 的类型)的子类型。因为scala.Intscala.Longscala.Boolean...等类型(对应Java的原始类型)是值类型,所以不能为null。

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

使用这张 Scala 类型层次结构图(摘自 the official documentation)可能更容易理解: