【发布时间】:2013-10-04 09:47:24
【问题描述】:
根据scala docs:
Null 是所有引用类型的子类型;
所以理论上,在这个例子中,我们可以假设Null 是Foo(引用类型)的子类型,并且我们应该能够尝试在@987654328 类型的实例上调用bar 方法@。实际上我们不能,并且代码 sn-p 在编译时失败,错误为value bar is not a member of Null。
case class Foo(bar: String)
val n: Null = null
n.bar
我认为我们在编译时捕获它是有道理的,因为 scala 文档也是 say [Null's] only instance is the null reference,但我认为更好的错误消息是 Calling bar on type Null can only result in a NullPointerException。
我的问题是关于以下代码 sn-p,它在编译时不会失败,而是在运行时失败,并显示 NullPointerException
val n: Null = null
n.toString
我假设这是因为 Null 类型并没有真正继承所有其他引用类型,并且只继承 AnyRef,但是有什么理由不应该引发编译时错误(或至少警告)此代码只能导致NullPointerException?调用null.bar 和null.toString 行为不同是故意的吗?
【问题讨论】: