如果没有什么类型是在类层次结构的底部,为什么我不能调用它的任何可能的方法是什么?

StackOverflow https://stackoverflow.com/questions/1728541

  •  19-09-2019
  •  | 
  •  

阶类型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
}

当然作为NothingString的一个子类型,这应该是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是朝语的功能到底有多齿轮。这是必要的东西像OptionList,但只作为一个的类型下,不为一个类。

这里的区别是为那些从一个面向对象的背景的有点不可思议,但事实是,子类型作为一个概念是从OOP非常明显的。诚然,面向对象的真正意味着亚型以某种形式,但反之则不然。本杰明·皮尔斯的类型和编程语言的确实呈现语言 F_ <好工作(发音为“F子”),其作为与子类型(但不是OO)一种语言的最小例子。

现在,随着所有的说,我不同意这样一个事实,Nothing是从正常的继承规则免疫似乎有点不一致。然而,从理论的角度来看,它非常有意义。

其他提示

我想Nothing可以接受的任何方法,并且在所有这些执行标准操作(抛出异常)。这不会是非常有用的,虽然。

通过展示编译错误,编译器警告说,一个类型,他很可能不希望程序员,Nothing,得到了在代码中的某一点莫名其妙的推断。

您可以在toString变量调用Nothing因为IT方面确定指标:点击 final trait Nothing extends Any结果 和toString是Any的成员。我认为唯一的类型界限Scala编译器治疗的Nothing并将它就像在案件上的所有其他特质。让调用任何方法对可变型Nothing将是很奇怪的我想。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top