我是scala的新手。请帮我理解下面的代码片段
null.==("goutam") // ---> return false
null.equals("goutam") // ---> throw NullPointerException
根据我的理解,null是Null特征的唯一实例,它扩展了Anyref和==,并且两者都是AnyRef的函数。那么为什么第一个声明不会抛出而第二个声明呢?
答案 0 :(得分:7)
为什么第一个语句不会抛出,但第二个语句不会抛出
根据语言规范(6.3),null
上有特定的方法,如果调用它们不会导致NullReferenceException
。他们被定义为:
6.3空值
null
值的类型为scala.Null
,因此 与每种参考类型兼容。它表示参考值 它指的是一个特殊的“null”对象。该对象实现 类scala.AnyRef
中的方法如下:如果参数x也是" null"
eq(x)
和==(x)
返回true 宾语。ne(x)
和!=(x)
如果参数x不是,则返回true "空"宾语。isInstanceOf[T]
始终返回false。asInstanceOf[T]
返回类型T的默认值。##
返回0.对" null"的任何其他成员的引用object 导致抛出NullPointerException 。
equals
在AnyRef
上定义,并且根据定义不会处理null
值。可以使用eq
来检查引用相等性(通常不是您想要做的事情):
scala> null.==("goutam")
res0: Boolean = false
scala> null.eq("goutam")
res1: Boolean = false
==
可以正确处理null
,这就是您应该使用的内容。有关详情,请参阅Whats the difference between == and .equals in Scala?