Any 前面已經有兩次提到過:在scala中,Any類是所有類的超類。 Any有兩個子類:AnyVal和AnyRef。對應Java直接類型的scala封裝類,如Int、Double等,AnyVal是它們的基類;對應引用類型,AnyRef是它們的基類。 scala中,所有類的關係可以用下麵這張圖大致描... ...
Any
前面已經有兩次提到過:在scala中,Any類是所有類的超類。
Any有兩個子類:AnyVal和AnyRef。對應Java直接類型的scala封裝類,如Int、Double等,AnyVal是它們的基類;對應引用類型,AnyRef是它們的基類。
scala中,所有類的關係可以用下麵這張圖大致描述下:
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就是個鬼,當遇到無法解釋或不好解釋的內容,就可以堂而皇之的說“鬼曉得”。
###########