如果没有什么类型是在类层次结构的底部,为什么我不能调用它的任何可能的方法是什么?
题
阶类型Nothing
表示(我理解)类型层次结构的底部,还由符号⊥表示。也就是说,Nothing
是子类型的任何给定类型的。用于Nothing
类型的要求是由詹姆斯IRY 对于我们这些很好地解释没有类型理论的理论背景!
我的问题是,如果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
的一个子类型,这应该是OK?请注意,以下编译就好了!
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非常明显的。诚然,面向对象的真正意味着亚型以某种形式,但反之则不然。本杰明·皮尔斯的类型和编程语言的确实呈现语言 F_ <好工作(发音为“F子”),其作为与子类型(但不是OO)一种语言的最小例子。
现在,随着所有的说,我不同意这样一个事实,Nothing
是从正常的继承规则免疫似乎有点不一致。然而,从理论的角度来看,它非常有意义。
其他提示
我想Nothing
可以接受的任何方法,并且在所有这些执行标准操作(抛出异常)。这不会是非常有用的,虽然。
通过展示编译错误,编译器警告说,一个类型,他很可能不希望程序员,Nothing
,得到了在代码中的某一点莫名其妙的推断。
您可以在toString
变量调用Nothing
因为IT方面确定指标:点击
final trait Nothing extends Any
结果
和toString是Any
的成员。我认为唯一的类型界限Scala编译器治疗的Nothing
并将它就像在案件上的所有其他特质。让调用任何方法对可变型Nothing
将是很奇怪的我想。