scala.Null澄清

时间:2016-03-07 14:26:46

标签: scala null

想澄清一下scala.Null。据我所知scala.Null实例为null和class。例如,如果写这样

val x: Null = null 

x Null的类型推断集类型。

根据Scala课程hierarhy"请参阅图片" Scala不能使用没有包装器的变量,如Int,Double等。这就是为什么我们可以找到Null用于类型推断机制解析。这是正确的愿景吗?

Scala classes hierarhy

2 个答案:

答案 0 :(得分:2)

您似乎在混合其中一些概念:

类型推断是编译器在代码未明确声明类型时推断类型的能力。在你的例子中 - 你陈述类型,那个类型是Null - 这里没有推论:

val x: Null = null 

以下是类型推断的一个简单示例:

scala> val whoKnows = 12
whoKnows: Int = 12

编译器推断出类型Int,因为我们分配了值12,这是一个整数。还有更多内容(参见http://docs.scala-lang.org/tutorials/tour/local-type-inference),但这是基础知识。

null 可以在Scala 中使用,就像在Java中一样(虽然它非常不赞成,因为Scala提供了许多更安全的替代方案,主要是{{1 }}),例如:

None

哪里可以 null?就像在Java中一样 - 对于"原语"像int,double等。在Scala中,没有原始的东西,但这些"值"之间仍然存在差异。类型(以大写字母命名,如其他类型,例如scala> val nullStr: String = null nullStr: String = null scala> val nullList: List[Int] = null nullList: List[Int] = null Int)和其他类型:值类型共享公共特征Double,而所有其他类型共享特征{{1 - 除其他外,表示这种差异。

至于AnyVal特性有什么用处 - 请参阅Usages of Null / Nothing / Unit in Scala

答案 1 :(得分:1)

Scala中的Null类型是一种特殊类型。它的特殊之处在于它是所有引用类型的子类型 - 它是每种类型的子类型,是AnyRef的子类型。

原因是可以将值null分配给任何引用类型。

请注意,除了引用类型之外,Scala还具有值类型。这些是AnyVal的子类型。值类型的示例是映射到JVM的基本类型的内置类型:ByteShortIntLongFloatDoubleBooleanChar以及Unit类型。

请注意,AnyVal及其子类型是 <{1}}的子类型。您无法将AnyRef分配给值类型的变量。

请注意,值类型nullInt,如Java的包装类型(Doublejava.lang.Integer等等。)。使用值类型时,对象上没有装箱和取消装箱。这些值类型直接映射到JVM的基本类型。因此,您无法将java.lang.Double分配给其中一种类型的变量。

换句话说:nullInt等类型不是包装,它们直接表示原始类型。