2012-04-09 104 views
7

我剛纔讀this question和偶然發現了以下報價:這可以在斯卡拉空?

斯卡拉把==,如果它被定義爲Any類如下:

final def == (that: Any): Boolean = 
    if (null eq this) (null eq that) else (this equals that) 

(null eq this)部分使我想知道:是它實際上可以調用空指針的方法?可以在斯卡拉thisnull

+1

你在抽象與實現混淆。抽象地說,可以調用'null'的方法,比如'=='。顯然,JVM上的實現不會調用空指針上的方法。 – 2012-04-09 14:48:34

回答

8

檢查出Scala language specification,即6.3空值章:

null值是scala.Null類型的,並且因此與每個引用 類型兼容。它表示一個參考值,它指的是一個特殊的「空」對象。這個對象 實現了scala.AnyRef類的方法如下:

eq(x)==(x)返回true,如果參數x也是「空」的對象。

ne(x)!=(x)如果參數x也不是「null」對象,則返回true。

這意味着,在語義上比較時,一些與null文字或文字null的東西你實際上指的是一種特殊的scala.Null類的方法。將null視爲該類別的簡寫。

當然在執行層面上它被優化了,並且使用了普通的null

3

nullNull類的唯一實例,它是一個有效的對象。 Null是所有參考類型的子類型。