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
它更倾向于语言的功能结束.这是必要的东西像Option
和List
,但只作为一个类型,而不是作为一个阶级.
对于那些来自面向对象背景的人来说,这里的区别有点奇怪,但事实上,作为概念的子类型与OOP非常不同.当然,面向对象确实意味着某种形式的子类型,但反之则不然.Benjamin Pierce的类型和编程语言很好地呈现了语言F_ <(发音为"F sub"),它作为具有子类型(但不是OO)的语言的最小示例.
现在,尽管如此,我确实同意Nothing
不受正常继承规则影响的事实似乎有点不一致.然而,从理论的角度来看,它是完全合理的.
归档时间: |
|
查看次数: |
2545 次 |
最近记录: |