簡(jiǎn)單接觸Scala底層類型
在圖釋11.1類型層級(jí)的底部你看到了兩個(gè)類scala.Null和Scala.Nothing。它們是用統(tǒng)一的方式處理某些Scala的面向?qū)ο箢愋拖到y(tǒng)的“邊界情況”的特殊類型。
51CTO編輯推薦:Scala編程語言專題
類Null是null類型的引用;它是每個(gè)引用類(就是說,每個(gè)繼承自AnyRef的類)的子類。Null不兼容值類型。你不可,比方說,把null值賦給整數(shù)變量:
類型Nothing在Scala的類層級(jí)的***端;它是任何其它類型的子類型。然而,根本沒有這個(gè)類型的任何值。要一個(gè)沒有值的類型有什么意思呢?7.4節(jié)中討論過,Nothing的一個(gè)用處是它標(biāo)明了不正常的終止。例如Scala的標(biāo)準(zhǔn)庫中的Predef對(duì)象有一個(gè)error方法,如下定義:
- scala>val i: Int = null
- < console>:4:error:typemismatch;
- found:Null(null)
- required:Int
error的返回類型是Nothing,告訴用戶方法不是正常返回的(代之以拋出了異常)。因?yàn)镹othing是任何其它類型的子類,你可以非常靈活的使用像error這樣的方法。例如:
- def error(message:String): Nothing = throw new RuntimeException(message)
- def divide(x:Int, y:Int): Int =
- if(y != 0) x / y
- else error("can't divide by zero")
“那么”狀態(tài)分支,x / y,類型為Int,而“否則”(else)分支,調(diào)用了error,類型為Nothing。因?yàn)镹othing是Int的子類型,整個(gè)狀態(tài)語句的類型是Int,正如需要的那樣。
【相關(guān)閱讀】