0

根据scala 文档

Null 是所有引用类型的子类型;

所以理论上,在这个例子中,我们可以假设NullFoo(a reference type) 的子类型,并且我们应该能够尝试在bartype 的实例上调用该方法Null。实际上,我们不能,并且代码片段在编译时失败并出现错误value bar is not a member of Null


case class Foo(bar: String)

val n: Null = null
n.bar

试试看


我认为我们在编译时捕获它是有道理的,因为正如 scala 文档也所说 [Null's] only instance is the null reference,但是我认为更好的错误消息会是Calling bar on type Null can only result in a NullPointerException

我的问题是关于以下代码片段,它在编译时不会失败,而是在运行时失败NullPointerException


val n: Null = null
n.toString

试试看


我假设这是因为 Null 类型并没有真正继承所有其他引用类型,而只是 subclasses AnyRef,但是有什么理由不应该引发编译时错误(或至少警告),该代码只能导致一个NullPointerException?打电话null.barnull.toString行为不同是故意的吗?

4

1 回答 1

0

Null is a subtype of all reference types;- 这意味着类似的东西:

val n: Foo = null
n.bar //throws NPE

val a: String = null
a.charAt(0) //NPE again

所以你可以说Null是所有引用类型的子类型。

编辑:

val n: Null = null 
n.bar 

部分不正确。根据 Scala 文档:

abstract final class Null extends AnyRef

AnyRef没有bar。你不能这样说,对吧?

val n: AnyRef = ""
n.charAt(0) //won't compile
于 2013-10-04T10:15:30.627 回答