簡體   English   中英

了解scala.Nothing類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM