繁体   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