[英]If the Nothing type is at the bottom of the class hierarchy, why can I not call any conceivable method on it?
scala類型Nothing
代表(據我所知)類型層次結構的底部,也用符號denoted表示。 也就是說, Nothing
是任何給定類型的子類型。 James Iry對我們這些沒有類型理論背景理論背景的人解釋了對Nothing
類型的要求!
所以我的問題是,如果Nothing
是每種類型的子類型,為什么我不能在Nothing
上調用任何類型的方法? 顯然,我無法實例化Nothing但為什么不進行以下編譯?
var n: Nothing = _
def main(args: Array[String]) {
println(n.length) //compile error: value length is not a member of Nothing
}
當然Nothing
是String
的子類型,這應該沒問題? 請注意,以下編譯就好了!
var n: Nothing = _
def foo(s: String) : Int = s.length
def main(args: Array[String]) {
println(foo(n))
}
同樣如下:
def main(args: Array[String]) {
println(n.asInstanceOf[String].length)
}
雖然Nothing
不是所有東西的子類型,但它不會繼承任何方法,除了Any
。 這是因為Nothing
比語言的功能性更強。 對於像Option
和List
這樣的東西是必要的,但只是作為一種類型 ,而不是作為一個類。
對於那些來自面向對象的背景的人來說,這里的區別有點奇怪,但事實上,作為概念的子類型與OOP非常不同。 當然,面向對象確實意味着某種形式的子類型,但反之則不然。 Benjamin Pierce的類型和編程語言很好地呈現了語言F_ < (發音為“F sub”),它作為具有子類型(但不是OO)的語言的最小示例。
現在,盡管如此,我確實同意Nothing
不受正常繼承規則影響的事實似乎有點不一致。 然而,從理論的角度來看,它是完全合理的。
我想Nothing
可以接受任何方法,並對所有方法執行標准操作(拋出異常)。 但這並不是很有用。
通過呈現編譯錯誤,編譯器警告程序員他最有可能不想要的類型, Nothing
,在代碼中的某個點以某種方式得到推斷。
您可以在Nothing
變量上調用toString
,因為它的定義:
final trait Nothing extends Any
toString是Any
成員。 我認為scala編譯器只對類型邊界中的Nothing
進行處理,並將其視為對所有情況的任何其他特征。 我想,讓我們對Nothing
類型的變量調用任何方法都會非常奇怪。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.