scala學習手記1 - Any和Nothing

轉自:https://www.cnblogs.com/amunote/p/5612341.html


Any

在scala中,Any類是所有類的超類。

Any有兩個子類:AnyVal和AnyRef。對應Java直接類型的scala封裝類,如Int、Double等,AnyVal是它們的基類;對應引用類型,AnyRef是它們的基類。

scala中,所有類的關係可以用下面這張圖大致描述下:

3RTDt3VOau69lT

Any是一個抽象類,它有如下方法:!=()、==()、asInstanceOf()、equals()、hashCode()、isInstanceOf()和toString()。AnyVal沒有更多的方法了。AnyRef則包含了Java的Object類的一些方法,比如notify()、wait()和finalize()。

AnyRef是可以直接當做java的Object來用的。對於Any和AnyVal,只有在編譯的時候,scala纔會將它們視爲Object。換句話說,在編譯階段Any和AnyVal會被類型擦除爲Object。

Nothing

一直以來,都是將scala中的概念和Java對比着來學的。確實,很多內容也都能對的上。但是Nothing這個概念卻不好說了。它有點兒像java中的null——在沒有明確指出的情況下,它們可以是任何類的值。但是在語義上二者有着本質的區別:Nothing是所有對象的子類,是一個類;null是所有對象的默認值,是一個特殊的獨立的概念(null不是對象),是一個特殊的唯一的值。

Nothing到底是什麼呢?或者換個方向考慮:Nothing的用處是什麼呢?

再看一下上面的那張圖,可以看到:所有類的基類都是Any,所有類的最終子類都是Nothing。換個角度來考慮:任何一個實例的類型都可以視爲Any;一個Nothing的實例可以看做是任何類的實例。可是再想想,Nothing有實例麼,可以將什麼樣的值賦給一個Nothing的實例呢。想不到可以將怎樣的值賦給一個Nothing實例。Nothing看起來象是一個無用的定義。

想了好久也弄不明白Nothing的用處。姑且先記住教材上的說法吧:Nothing是一個抽象的概念,它的作用是幫助類型更平滑地進行。

-----

忽的有了一個有趣的想法:Nothing就是個鬼,當遇到無法解釋或不好解釋的內容,就可以堂而皇之的說“鬼曉得”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章