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