根据scala 文档:
Null 是所有引用类型的子类型;
所以理论上,在这个例子中,我们可以假设Null
是Foo
(a reference type) 的子类型,并且我们应该能够尝试在bar
type 的实例上调用该方法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.bar
和null.toString
行为不同是故意的吗?