まず、'まあ、java.lang.Stringでさえありません'ステートメントは完全に正しくありません。プレーン名は、オブジェクトString
で定義されたタイプエイリアスに由来します。Predef
type String = java.lang.String
の内部はPredef
すべてのScalaソースにインポートされるためString
、fullの代わりに使用しますjava.lang.String
が、実際には同じです。
java.lang.String
JVMによって特別な方法で扱われる非常に特別なクラスです。@ 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ランタイムなど)のプリミティブを使用するための洗練された方法も提供します。