Scala 'null' 算作另一种类型的实例吗?

zap*_*dlo 3 parameters types scala

我有这个代码:

class MyLinkedList[T](h: T, tail: MyLinkedList[T]) {
    def prepend(v: T): MyLinkedList[T] = new MyLinkedList(v, this) 
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何将第二个参数作为 null 传递并且它可以工作:

val l: MyLinkedList[Int] = new MyLinkedList(1, null)
Run Code Online (Sandbox Code Playgroud)

null是 MyLinkedList[Int] 的一个实例??似乎没有:

println(null.isInstanceOf[MyLinkedList[Int]])
Run Code Online (Sandbox Code Playgroud)

输出false

所以为什么?

Pét*_*rök 5

本博客文章很好地解释了null在斯卡拉(连同NullNilNothingNone):

Null是一个 trait,它(如果你不熟悉 trait)有点像 Java 中的抽象类。只存在一个 的实例Null,那就是null。没那么难。文字null的用途与它在 Java 中的用途相同。它是不引用任何对象的引用的值。因此,如果您编写一个接受 type 参数的方法,Null则只能传入两件事:null它本身或 type 的引用Null

因此null不是 Scala 类型系统中任何类型的实例,除了Null

scala>  null.isInstanceOf[Any]
res1: Boolean = false
Run Code Online (Sandbox Code Playgroud)

好的,所以它一定是Nullthen 的一个实例,对吧?好...

scala>  null.isInstanceOf[Null]
<console>:8: error: type Null cannot be used in a type pattern or isInstanceOf test
       null.isInstanceOf[Null]
Run Code Online (Sandbox Code Playgroud)

总的来说,正如其他人所指出的,Null它的null存在仅仅是为了与 Java 向后兼容。否则,Null与 状态相同Nothing,但后者没有实例,它是Scala类型系统的一个更有机的部分,因为它在特定的使用场景中有很好的定义角色,比如定义一个空集合,或者异常退出从函数调用。