“没有什么是其他所有类的子类”,如何理解它?

时间:2017-07-13 12:18:22

标签: scala

这些天,我正在阅读“scala编程”一书。第246页第11章第一段的书中有一句话:

  

例如,就像Any是每个其他类的超类一样,Nothing   是每个其他类的子类。

我理解第一部分因为每个类都以直接或间接方式继承Any。但我无法理解句子的后半部分。

这是类Nothing定义:

abstract final class Nothing extends Any

1 个答案:

答案 0 :(得分:8)

从概念上讲,NothingAny更难掌握,我们熟悉Java和大多数其他面向对象编程。 Nothing是Scalas bottom type。维基百科的定义指出:

  

在子类型系统中,底部类型是所有类型的子类型。   (但是,相反的情况并非如此 - 所有类型的子类型都不是   必然是底部类型。)它用于表示返回类型   一个不返回值的函数:例如,一个   永远循环,发出异常信号或退出。

我认为解释它的最简单方法是将其视为描述永不返回的东西的一种方式。您无法自己构建Nothing类型的实例。 Scala中Nothing的一个特殊用途是能够推断出协变参数类型:

  

在Scala中,底部类型表示为Nothing。除了它的用途   仅抛出异常或以其他方式不返回的函数   通常,它也用于协变参数化类型。对于   例如,Scala的List是一个协变型构造函数,所以   对于所有类型A ,List[Nothing]List[A]子类型。所以Scala的Nil,   标记任何类型列表结尾的对象属于   输入List[Nothing]

作为子类型与子类不同。来自Subtyping

  

不应将子类型与(类或对象)的概念混淆   从面向对象语言继承;子类型是一种关系   类型之间(面向对象的说法中的接口),而   继承是源自a的实现之间的关系   允许从现有对象创建新对象的语言功能   那些。在许多面向对象的语言中,调用子类型   接口继承。

这也在Scala Specification Section §3.5.2(一致性)中表示为<:(是关系的子类型)的一部分,对于值类型和类型构造函数都是:

  
      
  • 对于每种值类型Tscala.Nothing <: T <: scala.Any
  •   
  • 对于每个类型构造函数T(包含任意数量的类型参数),scala.Nothing <: T <: scala.Any
  •   

子类型的一个常见方面是泛型类型的方差,其中-表示逆变,+表示协方差。