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。
所以为什么?
本博客文章很好地解释了null在斯卡拉(连同Null,Nil,Nothing和None):
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类型系统的一个更有机的部分,因为它在特定的使用场景中有很好的定义角色,比如定义一个空集合,或者异常退出从函数调用。