如果Nothing类型位于类层次结构的底部,为什么我不能在其上调用任何可想到的方法?

oxb*_*kes 15 types scala nothing

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
}
Run Code Online (Sandbox Code Playgroud)

当然,Nothing这个子类型String应该可以吗?请注意,以下编译就好了!

var n: Nothing = _

def foo(s: String) : Int =  s.length

def main(args: Array[String]) {
  println(foo(n))
}
Run Code Online (Sandbox Code Playgroud)

同样如下:

def main(args: Array[String]) {
  println(n.asInstanceOf[String].length) 
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*wak 17

虽然Nothing是一切的子类型,但它不会继承任何方法,除了那些Any.这是因为Nothing它更倾向于语言的功能结束.这是必要的东西像OptionList,但只作为一个类型,而不是作为一个阶级.

对于那些来自面向对象背景的人来说,这里的区别有点奇怪,但事实上,作为概念的子类型与OOP非常不同.当然,面向对象确实意味着某种形式的子类型,但反之则不然.Benjamin Pierce的类型和编程语言很好地呈现了语言F_ <(发音为"F sub"),它作为具有子类型(但不是OO)的语言的最小示例.

现在,尽管如此,我确实同意Nothing不受正常继承规则影响的事实似乎有点不一致.然而,从理论的角度来看,它是完全合理的.