6

私はJavaを少し知っているので、すべてのScalaコードで、、、...などのいくつかのJavaタイプを使用しようとしてjava.lang.Integerjava.lang.Characterましjava.lang.Booleanた。今、人々は私に「いいえ!Scalaには独自のタイプがあり、Javaのものは機能しますが、常にScalaのタイプとオブジェクトを好むべきです」と言われました。

わかりました。ScalaにはJavaにあるものがすべてあります。たとえば、Javaブール値の代わりにScalaブール値を使用する方がよい理由はわかりませんが、問題ありません。私が見たタイプを見るscala.Booleanscala.Int、、、scala.Byte...そして文字列を見るが、そうではないscala.String(まあ、java.lang.String 混乱さえしない)それはただの文字列である。しかし、私はscalaから直接来るものすべてを使うべきだと思いました。たぶん私はscalaを正しく理解していませんが、誰かがそれを説明してもらえますか?

4

2 に答える 2

12

まず、'まあ、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型はクラスではなくcharbooleanこれらの型の値はオブジェクトではありません。しかし、Scalaは完全にオブジェクト指向言語であり、プリミティブ型はありません。java.lang.{Integer,Boolean,...}対応するタイプが必要な場所ならどこでも使用できますが、ボクシングのためにこれは非常に非効率的です。
このため、Scalaはオブジェクト指向設定でJavaプリミティブ型を提示する方法を必要としていました。scala.{Int,Boolean,...}クラスが導入されました。これらのタイプは、Scalaコンパイラーを介して特別に処理されます。scalacは、これらのクラスの1つに遭遇すると、プリミティブを処理するコードを生成します。またAnyVal、クラスを拡張するnullため、これらのタイプの値として使用できなくなります。このアプローチは、効率の問題を解決し、java.lang.{Integer,Boolean,...}ボクシングが本当に必要な場所でクラスを利用できるようにし、別のホストシステム(.NETランタイムなど)のプリミティブを使用するための洗練された方法も提供します。

于 2012-11-27T11:03:47.293 に答える
4

ここで推測しているだけです

ドキュメントを見ると、プリミティブのscalaバージョンが、java.langラッパーのようにboxing-unboxingに頼ることなく、数値型またはブール型、および賢明な変換で機能するすべての期待される演算子を提供していることがわかります。

この選択は、プリミティブ型に期待されるものに均一かつ自然にアクセスできるようにすると同時にObjects、他のスカラ型と同じようにするために行われたと思います。

私はそれがすでに、そしてその実装においてjava.lang.String、異なるアプローチを必要としたと思います。したがって、「最も苦痛の少ないパス」は、文字列で欠落している操作を取得し、残りはそのままにして、その周りに暗黙のリッチラッパーを作成することでした。Objectfinal

別の見方をjava.lang.Stringすれば、不変であり、それ以外の場合は、すでに十分に現状のままで十分でした。

Scalaの他の「プリミティブ」タイプには、追加の賢明な操作を提供する独自のRichラッパーがあることを言及する価値があります。

于 2012-11-27T09:27:28.820 に答える