为什么在 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 中的 long
。 Int
也是如此。
但是 Integer
是一个包装器 class 即 java.lang.Integer
如果你想要可空的 Long 值,你可以使用 java.lang.Long
Int
和 Long
是 Scala 类型,派生自 AnyVal
,它不是引用类型(即不是 AnyRef
),因此不能null
。另一方面,Integer
是 java.lang.Integer
的别名,它是一种引用类型。
不,这不是疏忽,Int
和 Long
是一致的,在 Scala 中使用 null
被认为是一件坏事,据我了解,null
的存在仅仅是为了 Java 兼容性(甚至 AnyRef
)以及 Integer
.
在 Scala 中,类型 scala.Null
是所有引用类型的子类型(所有类型都继承自 scala.AnyRef
- 这是 java.lang.Object
的别名)。这就是为什么您可以在任何需要引用类型的地方使用 null
值(scala.Null
类型)的原因。
但是,它不是任何值类型(继承自 scala.AnyVal
的类型)的子类型。因为scala.Int
、scala.Long
、scala.Boolean
...等类型(对应Java的原始类型)是值类型,所以不能为null。
至于你提到的Integer
类型:我猜这是java.lang.Integer
,它是java.lang.Object
的子类型(a.k.a。scala.AnyRef
) : 它是引用类型,所以你可以使用 null
.
使用这张 Scala 类型层次结构图(摘自 the official documentation)可能更容易理解:
我正在创建我的 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 中的 long
。 Int
也是如此。
但是 Integer
是一个包装器 class 即 java.lang.Integer
如果你想要可空的 Long 值,你可以使用 java.lang.Long
Int
和 Long
是 Scala 类型,派生自 AnyVal
,它不是引用类型(即不是 AnyRef
),因此不能null
。另一方面,Integer
是 java.lang.Integer
的别名,它是一种引用类型。
不,这不是疏忽,Int
和 Long
是一致的,在 Scala 中使用 null
被认为是一件坏事,据我了解,null
的存在仅仅是为了 Java 兼容性(甚至 AnyRef
)以及 Integer
.
在 Scala 中,类型 scala.Null
是所有引用类型的子类型(所有类型都继承自 scala.AnyRef
- 这是 java.lang.Object
的别名)。这就是为什么您可以在任何需要引用类型的地方使用 null
值(scala.Null
类型)的原因。
但是,它不是任何值类型(继承自 scala.AnyVal
的类型)的子类型。因为scala.Int
、scala.Long
、scala.Boolean
...等类型(对应Java的原始类型)是值类型,所以不能为null。
至于你提到的Integer
类型:我猜这是java.lang.Integer
,它是java.lang.Object
的子类型(a.k.a。scala.AnyRef
) : 它是引用类型,所以你可以使用 null
.
使用这张 Scala 类型层次结构图(摘自 the official documentation)可能更容易理解: