gpt4 book ai didi

scala - 如果 Nothing 类型位于类层次结构的底部,为什么我不能对其调用任何可能的方法?

转载 作者:行者123 更新时间:2023-12-03 20:28:21 25 4
gpt4 key购买 nike

Scala 类型 Nothing代表(据我所知)类型层次结构的底部,也用符号 ⊥ 表示。即,Nothing是任何给定类型的子类型。对 Nothing 的要求类型是 explained well by James Iry对于我们这些没有类型理论理论背景的人!

所以我的问题是,如果 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更适合语言的功能端。对于 Option 之类的事情是必要的和 List ,但仅作为 类型 ,不作为一个类。

对于那些来自面向对象背景的人来说,这里的区别有点奇怪,但事实是子类型作为一个概念与 OOP 非常不同。诚然,面向对象确实意味着某种形式的子类型,但反之则不然。 Benjamin Pierce 的 Types and Programming Languages 很好地展示了语言 F_< (发音为“F sub”),它是具有子类型(但不是面向对象)的语言的最小示例。

现在,综上所述,我确实同意 Nothing 的事实。不受正常继承规则的影响似乎有点不一致。然而,从理论的角度来看,它是完全有道理的。

关于scala - 如果 Nothing 类型位于类层次结构的底部,为什么我不能对其调用任何可能的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1728541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com