2016-11-28 5 views
1

value classesは、ボックス解除のオーバーヘッドなしでタイプの安全性を達成するために使用できます。なぜscala値のクラス#toStringに大文字小文字のクラス情報が含まれていますか?

ランタイムでは、そのようなタイプ/クラスが「存在しない」という単純なタイプと見なされていたという印象を受けました(たとえば、値クラスcase class X(i: Int) extends AnyValは実行時には単純なIntになります)。

しかし、あなたは値クラスのインスタンスで.toStringメソッドを呼び出して実行する場合、それは何か印刷し:

scala> val myValueClass = X(3) 
myValueClass: X = 3 

scala> myValueClass.toString 
res5: String = X(3) 

ので、私は、コンパイラは結局いくつかの情報を含んでいると思いますか?

答えて

4

コンパイラは、クラスのコンパニオンオブジェクトに対応する静的メソッドを作成します。これは、値クラス型のオブジェクトのメソッド呼び出しをシミュレートするために、int値をパラメータとして呼び出されます。

値クラス自体は、ソースコード内にのみ存在します。コンパイルされたバイトコードでは、実際のプリミティブintが使用され、実際のメソッド呼び出しを持つ新しいオブジェクトインスタンスではなく、静的メソッドが呼び出されます。このメカニズムの詳細については、hereを参照してください。 (たとえ非ケース値クラスはequalsとケースクラスのよう自動的に定義hashCodeを有する除く)(法的な場合)extends AnyValを追加または削除することは計算の結果を変更しないように

1

値クラスが設計されています。これは、の一部ではの状況で生き残る必要があります。

def toString(x: Any) = x.toString 

toString(myValueClass) 

ですが、ご質問の状況はいずれかではありません。

http://docs.scala-lang.org/sips/completed/value-classes.html#expansion-of-value-classesは、バリュークラスがどのように実装されているかをより正確に説明し、どのような場合に生き残るかを見るのに役立ちます。

関連する問題