想澄清一下scala.Null。据我所知scala.Null实例为null和class。例如,如果写这样
val x: Null = null
x Null的类型推断集类型。
根据Scala课程hierarhy"请参阅图片" Scala不能使用没有包装器的变量,如Int,Double等。这就是为什么我们可以找到Null用于类型推断机制解析。这是正确的愿景吗?
答案 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的基本类型的内置类型:Byte
,Short
,Int
,Long
,Float
, Double
,Boolean
和Char
以及Unit
类型。
请注意,AnyVal
及其子类型是 <{1}}的子类型。您无法将AnyRef
分配给值类型的变量。
请注意,值类型null
,Int
等不,如Java的包装类型(Double
,java.lang.Integer
等等。)。使用值类型时,对象上没有装箱和取消装箱。这些值类型直接映射到JVM的基本类型。因此,您无法将java.lang.Double
分配给其中一种类型的变量。
换句话说:null
和Int
等类型不是包装,它们直接表示原始类型。