當的==
任一側是null
或如果==
第一個操作數的計算結果爲空,那麼Scala中不會調用equals
。那麼,在這種情況下,是的,x == null
與x 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
結果說是 「新對象」 將永遠是相同的(爲null)。
我懷疑x == y
可能會有比x == null
發出稍微更多/不同的代碼(萬一必須調用equals),但尚未檢查。
快樂編碼。
Scala的語言規範的第6.3節(空值)已經這樣說的:
null值是類型的scala.Null,並且因此與每個引用 兼容類型。它表示一個引用一個特殊的「空」對象的引用值。該目的 實現類scala.AnyRef方法如下:
- [空]當量(x)和[空] ==(x)的返回當且僅當自變量x真也是「空」對象。
- ne(x)和!=(x)如果參數x不是「null」對象,則返回true。
- isInstanceOf [T]總是返回false。
- asInstanceOf [T]返回「null」對象本身,如果T符合 scala.AnyRef,否則拋出NullPointerException。
對「null」對象的任何其他成員的引用會導致引發NullPointerException 。
但是與'null'比較,有沒有區別?我可以在這裏使用'null == last'嗎? – Freewind