Scala中`null == last`和`null eq last`之间有什么区别?

时间:2011-08-14 05:53:22

标签: scala equals

我在scala 2.7.7的内置类MessageQueue.scala中看到了第164行,它是:

def extractFirst(p: Any => Boolean): MessageQueueElement = {
changeSize(-1) // assume size decreases by 1

val msg = if (null eq last) null
else {
    ...
  }
}

我不理解val msg = if (null eq last) null,为什么它使用eq,而不是null。如果我写if (last==null) null,它是否正确?有什么不同吗?

2 个答案:

答案 0 :(得分:13)

== 的任何一方 null ,如果== 的第一个操作数评估为< / em> null,然后Scala不会调用equals。所以,在这种情况下,是的,x == nullx eq null相同; equals方法被调用。请注意以下情况。

考虑一下:

class X {
   // this is just for testing
   // any equals that returns true when the other object is null
   // is arguably broken. thus even though it may be invoked
   // the end semantics should remain the same
   override def equals(x: Any) = true
}
var x = new X()
x == null // false -- compiler optimization?
null == x // false
var y = null
y == x // false -- see documentation below, y is null, x is not
x == y // true  -- x does not evaluate to null, equals invokes
x eq y // false

请注意:

(new X()) == null

警告结果“新鲜物体”永远不会相等(为空)。

我怀疑为x == y发出的代码可能比x == null略多/不同(如果必须调用equals),但尚未检查。

快乐的编码。


Scala语言规范的第6.3节(空值)可以这样说:

  
    

null值的类型为scala.Null,因此与每个引用兼容     类型。它表示引用特殊“空”对象的引用值。这个对象     在类scala.AnyRef中实现方法如下:

         
        
  • [null] eq(x)和[null] ==(x)如果参数x也是“null”对象,则返回true。
  •     
  • ne(x)和!=(x)如果参数x不是“null”对象,则返回true。
  •     
  • isInstanceOf [T]始终返回false。
  •     
  • 如果T符合,则asInstanceOf [T]返回“null”对象本身     scala.AnyRef,否则抛出NullPointerException。
  •     
         

对“null”对象的任何其他成员的引用会导致a     抛出NullPointerException。

  

答案 1 :(得分:0)

scala中的运算符==与Java不同。

在scala中,==与Any中的equals方法等效,eq相当于Java中的==

<> BTW,为什么不null.asInstanceOf [Int],null.asInstanceOf [Double],null.asInstanceOf [Boolean],null.asInstanceOf [Char]抛出NullPointerException?