まず、'まあ、java.lang.Stringでさえありません'ステートメントは完全に正しくありません。プレーン名は、オブジェクトStringで定義されたタイプエイリアスに由来します。Predef
type String = java.lang.String
の内部はPredefすべてのScalaソースにインポートされるためString、fullの代わりに使用しますjava.lang.Stringが、実際には同じです。
java.lang.StringJVMによって特別な方法で扱われる非常に特別なクラスです。@ pagoda_5bが言ったように、それはとして宣言されておりfinal、それを拡張することはできません(そしてこれは実際には良いです)ので、ScalaライブラリはRichString追加の操作とデフォルトで利用可能な暗黙の変換を備えたラッパー()をString -> RichString提供します。
Integerただし、、Characterなどの状況は少し異なります。JVMによって特別に処理されていても、インスタンスがプレーンオブジェクトであるプレーンクラスであるBooleanことがわかります。String意味的には、Listクラスなどと違いはありません。
プリミティブ型には別の状況があります。Java 、、int型はクラスではなくchar、booleanこれらの型の値はオブジェクトではありません。しかし、Scalaは完全にオブジェクト指向言語であり、プリミティブ型はありません。java.lang.{Integer,Boolean,...}対応するタイプが必要な場所ならどこでも使用できますが、ボクシングのためにこれは非常に非効率的です。
このため、Scalaはオブジェクト指向設定でJavaプリミティブ型を提示する方法を必要としていました。scala.{Int,Boolean,...}クラスが導入されました。これらのタイプは、Scalaコンパイラーを介して特別に処理されます。scalacは、これらのクラスの1つに遭遇すると、プリミティブを処理するコードを生成します。またAnyVal、クラスを拡張するnullため、これらのタイプの値として使用できなくなります。このアプローチは、効率の問題を解決し、java.lang.{Integer,Boolean,...}ボクシングが本当に必要な場所でクラスを利用できるようにし、別のホストシステム(.NETランタイムなど)のプリミティブを使用するための洗練された方法も提供します。