我正在创建我的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]
,但希望清晰,这种方法有什么问题。
答案 0 :(得分:12)
Scala Long
是Java中的文字日期类型,如long
。 Int
也是如此。
但是Integer
是一个包装类,即java.lang.Integer
如果您想要可以为空的Long值,可以使用java.lang.Long
答案 1 :(得分:9)
Int
和Long
是Scala类型,派生自AnyVal
,它不是引用类型(即不是AnyRef
)因此无法成为null
。另一方面,Integer
是java.lang.Integer
的别名,它是一种引用类型。
不,它不是疏忽,Int
和Long
是一致的,在Scala中使用null
被视为一件坏事,据我了解,{{ 1}}仅用于Java兼容性(即使对于null
)以及AnyRef
。
答案 2 :(得分:3)
在Scala中,类型scala.Null
是所有引用类型的子类型(所有类型都继承自scala.AnyRef
- 这是java.lang.Object
的别名)。这就是为什么你可以在预期的参考类型的任何地方使用null
值(类型scala.Null
)。
但它不是任何值类型的子类型(从scala.AnyVal
继承的类型)。因为scala.Int
,scala.Long
,scala.Boolean
...(对应于Java的基元类型)等类型是值类型,所以它们不能为空。
至于你提到的Integer
类型:我猜这是java.lang.Integer
,它是java.lang.Object
(又名scala.AnyRef
)的子类型:它是引用类型,所以你可以使用null
。
使用此Scala类型层次结构图(从the official documentation解除)可能更容易理解: