3

我有这个代码:

class MyLinkedList[T](h: T, tail: MyLinkedList[T]) {
    def prepend(v: T): MyLinkedList[T] = new MyLinkedList(v, this) 
}

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

val l: MyLinkedList[Int] = new MyLinkedList(1, null)

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

println(null.isInstanceOf[MyLinkedList[Int]])

输出false

所以为什么?

4

3 回答 3

5

这篇博文在 Scala 中很好地解释了(null连同NullNil和):NothingNone

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

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

scala>  null.isInstanceOf[Any]
res1: Boolean = false

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

scala>  null.isInstanceOf[Null]
<console>:8: error: type Null cannot be used in a type pattern or isInstanceOf test
       null.isInstanceOf[Null]

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

于 2013-01-07T21:20:02.100 回答
4

null是 Scala 支持的东西,用于与在 JVM 和 .NET 框架上运行的其他语言反向兼容。语言设计者对此并不特别兴奋,但是是的,它的编译就像 Java 代码一样。你永远不应该在原生 Scala 情况下使用它。Scala 提供了最惯用的替代方案,例如Option使用实例SomeNone它本质上是一个Nullable包装器,用于当您确实需要允许 null 选项时。

于 2013-01-07T20:08:33.183 回答
0

看这个

class A
println(null.isInstanceOf[A])  // false

虽然我不知道为什么,但它似乎isInstanceOf不像我们预期的那样工作null。另一种进行类型检查的方法是

null: MyLinkedList[Int]

哪个有效。

于 2013-01-07T20:42:07.737 回答