[英]Understanding of scala.Nothing type
根據scala規范,scala.Nothing類型-所有類型的buttom。 類型“ Nothing”存在,但Nothing實例不存在。
這個怎么運作:
def ??? : Nothing = throw new NoImplementedError
def sys.error(message: String): Nothing = throw new RuntimeException()
def sys.exit(status: Int): Nothing = {...}
但是實際上,所有提到的方法都返回異常。 def sys.exit
能否請您進一步說明Nothing類型。 任何例子,解釋。
謝謝!
def ??? : Nothing = throw new NoImplementedError
沒有返回異常,而是引發了與眾不同的異常。 例外情況是一種控制流機制,該機制會導致控制立即跳轉到調用堆棧中最近的已安裝處理程序。 這意味着
val x = ???
x
永遠不會被賦值,所以x
可以有任何類型。 在scala類型系統中,此類型為Nothing
,它是所有類型的子類型。
非終止也沒有任何類型,因為它也從不返回值,例如
def loop(): Nothing = loop()
val x: Int = loop()
由於x
永遠不會分配,因此允許。
在Scala中,絕對所有內容都需要具有返回類型。
例如, println
具有返回類型Unit
因為它是不返回值的計算單位。
如果一切都需要具有返回類型,那么您將如何實現像???
這樣的函數???
,因此它可以由任何函數使用 , 無論它需要返回哪種類型 ?
嗯,這就是Nothing
目的,它是所有其他類型的子類型(因為Any
是所有其他類型的頂級類型),因此可以在任何地方使用返回Nothing
的函數,並且類型系統將始終保持一致。
正如您已經注意到,返回Nothing
函數永遠不會返回值。 那是因為沒有Nothing
是不可理解的價值。
您可以將其視為使編譯器“滿意”僅永久拋出或停止應用程序或循環的功能的一種方式。
如果您想知道為什么我們不使用Unit
而不是Nothing
,那么這里是一個示例:
def notYetImplemented: Unit = throw new Exception()
def myFunc: String = notYetImplemented
這不會編譯,因為Unit
是不是String
或亞型String
。 因此,您需要執行以下操作:
def myFunc: String = {
notYetImplemented
null
}
這不是很方便,即使我們教我們寫一個值來返回值,也永遠不會到達此代碼。
干杯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.