当他说Scala不支持多重继承时,他指的是多次继承一个方法实现。当然,您可以在一个类中实现多个接口/特征,它们甚至可以定义相同的方法,但是由于特征线性化,您不会在不同的实现之间产生冲突。
通常,如果您有一个C1
带有方法f()
的类和一个C2
也带有方法的类f()
,则多重继承意味着您可以以某种方式继承的两个实现f()
。这可能会导致各种问题,Scala只能通过让您从单个类继承来解决,而在具有多个特征的情况下,可以通过基于特征的顺序选择一个实现来解决这些问题。
至于Nothing
事情真的很简单,因为什么都没有定义任何属性或方法。因此,您不会有任何继承冲突。但是我认为您最惊奇的是来自对多重继承的不同理解。
一旦您了解了特征线性化有效消除了继承的任何歧义,并且由于这个原因我们不将多重特征的继承称为多重继承,那么您就可以了。
关于如何实现:编译器最终对此负责。请参阅Scala语言规范第3.5.2节的一致性,其中的其他属性包括:
For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.
换句话说,如果要正确实现编译器,则必须Nothing
按规范将编译器作为所有内容的子类型来处理。出于明显的原因,Nothing
未将其定义为从加载到系统的所有类中扩展,但是定义Nothing
为子类型的相关性仅限于与子类型相关的所有位置。
这里重要的一点是,不存在type的实例Nothing
,因此,对它的处理严格限于类型检查,这在编译器领域都是如此。