簡體   English   中英

如果Nothing類型位於類層次結構的底部,為什么我不能在其上調用任何可想到的方法?

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

當然NothingString的子類型,這應該沒問題? 請注意,以下編譯就好了!

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比語言的功能性更強。 對於像OptionList這樣的東西是必要的,但只是作為一種類型 ,而不是作為一個類。

對於那些來自面向對象的背景的人來說,這里的區別有點奇怪,但事實上,作為概念的子類型與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.

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