Scalaが多重継承をサポートしていないと彼が言うとき、彼はメソッド実装を複数回継承することを指します。もちろん、クラスに複数のインターフェース/特性を実装でき、同じメソッドを定義することもできますが、特性の線形化により異なる実装間で競合が発生することはありません。
一般に、C1
メソッドf()
を持つクラスとメソッドを持つクラスC2
がある場合f()
、多重継承は、の両方の実装を何らかの方法で継承できることを意味しますf()
。これによりさまざまな問題が発生する可能性があります。Scalaは、単一のクラスからのみ継承できるようにすることで解決し、複数の特性の場合は、特性の順序に基づいて1つの実装を選択します。
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
。したがって、その処理は、すべてコンパイラの領域内にある型チェックに厳密に制限されます。