Scala中的类型Nothing
代表了(就我理解的)类型层次结构的底部,也可用符号⊥表示。也就是说,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))
}
as does:
翻译为:同样如此:
def main(args: Array[String]) {
println(n.asInstanceOf[String].length)
}
n.length
中,Scala 不知道你正在谈论哪个方法length
-- 而且在你考虑它的参数(或this
参数)是否具有正确类型之前,你需要知道这一点。在foo(n)
中,已经很清楚了。 - Owen