加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如果没有类型在类层次结构的底部,为什么我不能调用任何

发布时间:2020-12-16 09:20:29 所属栏目:安全 来源:网络整理
导读:Scala类型Nothing表示(据我所知)类型层次结构的底部,也用符号⊥表示.也就是说,没有任何给定类型的子类型.对于我们没有理论背景的人来说,对于没有类型的要求是 explained well by James Iry的要求! 所以我的问题是,如果Nothing是每种类型的子类型,为什么我不
Scala类型Nothing表示(据我所知)类型层次结构的底部,也用符号⊥表示.也就是说,没有任何给定类型的子类型.对于我们没有理论背景的人来说,对于没有类型的要求是 explained well by James Iry的要求!

所以我的问题是,如果Nothing是每种类型的子类型,为什么我不能在Nothing上调用任何类型的方法?显然,我不能实例化没有,但是为什么下面的编译呢?

var n: Nothing = _

def main(args: Array[String]) {
  println(n.length) //compile error: value length is not a member of 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中的那些.这是因为没有什么更适合语言的功能结束.它需要像Option和List这样的东西,但只能作为一个类型,而不是一个类.

这里的区别对于面向对象的背景的人来说有点奇怪,但事实上,作为概念的子类型与OOP非常不同.面向对象真的意味着以某种形式进行子类型化,但反之亦然.本杰明·皮尔斯的类型和编程语言很好地展示了语言F_<(发音为“F sub”),它作为一种使用子类型(而不是OO)的语言的最小示例.

现在,所有这一切,我同意,没有任何东西免于正常继承规则的事实似乎有点不一致.然而,从理论的角度来说,这是完全正确的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读