Scala は、Java の型システムに非常に洗練されたクラス階層を重ね合わせます。上部の Any から、Java のオブジェクトとプリミティブをそれぞれカバーするために AnyRef と AnyVal に膨らみ、最後に収束し、参照型を Null に、すべての型を Nothing に折りたたみます。私が理解しているように、Nothing はすべてのサブタイプです。AnyRef/java.lang.Object のすべてのサブタイプのサブタイプを null にします。[ http://www.scala-lang.org/node/128を参照]
ただし、すべての Scala 型を単純にシームレスな型階層の要素と見なすことができないいくつかの不規則性、いくつかの場所があるようです。私はこれが面倒だと思っており、私が驚くかもしれない場所を理解したいと思っています.
これまでのところ、私はいくつかの不規則性を知っています:
1) Null は AnyRef のサブタイプですが、null.isInstanceOf[AnyRef] (または AnyRef の他のサブタイプ) を呼び出すと false が返されます。これは、Java の instanceof 演算子の動作と一致するように選択されたものと思われます。
2) 分散注釈に関係なく、すべてが Nothing に対して共変です。共変とマークされていない型 T を返すメソッドがある場合、そのメソッドをオーバーライドして型 Nothing を返すことができます。[注: この主張は間違っています。以下の回答とコメントを参照してください!]
3) isInstanceOf を AnyVal 型に適用できません [ isInstanceOf チェックで AnyVal を使用できない理由を参照してください。AnyValである値をテストする方法は? ]
4) 何かが isInstanceOf[Null] かどうかを尋ねるのは違法です。これは完全に首尾一貫した質問です (ただし、「myVar == null」でも同じ答えが得られるため、特に必要ではありません)。
Scala の型階層に不規則性や特殊なケースの例は他にありますか? 歓迎されない驚きを避けるために、これらは学び、理解する価値があると思います.