2016-09-23 8 views
0

リフレクションを使用してScalaクラスをインスタンス化する必要があります。Scalaクラスのコンストラクタのデフォルトの引数のネーミング

デフォルト値を持つ引数を持つクラスのデフォルトコンストラクタを使用したいので、これらのデフォルト値を取得する必要があります。

Scalaのデフォルト値はJVMの単なるメソッドなので、すべてのクラスメソッドを取得し、それらを呼び出すだけでデフォルト値を返す必要があります。

質問:私はデフォルトのargの値を返すメソッドには2つの異なる命名規則があることがわかり - (および「$ lessinit $大きい$のデフォルトの$ X」「が$デフォルトの$ Xを適用する」Xは、特定の引数の位置番号です)。 これらの2つの違いは何ですか? それはScalaのバージョンなどによりますか?

答えて

1

あなたはケースクラスに

case class Foo(bar: Int) 

を宣言した場合、これは通常のクラスとコンパニオンオブジェクトの両方を作成します:あなたは、デフォルトのパラメータ値を持っている場合は、もちろん

class Foo(bar: Int) { // def toString, hashCode, equals 
} 
object Foo { 
    def apply(bar: Int) = new Foo(bar) 
    // def unapply 
} 

、両方のコンストラクタとapplyメソッドはこれらのデフォルト値を使用する必要があります。他の行動は全く驚くべきことである。

コンストラクタのデフォルト値は$lessinit$greater$default$Xメソッドによって返されます(コンストラクタの名前は<init>なので)。 apply$default$Xは、applyメソッドのデフォルト値です。

ケースクラスがない場合は、自分でapplyメソッドを定義しない限り、$lessinit$greater$default$Xしか表示されません。

+0

私はそれを持って、ありがとう! –

+0

追加の質問:なぜapply()との2つの異なるデフォルト値メソッドがあるのですか? コンパニオンオブジェクトよりもクラスFoo(bar:Int = 0)を宣言しても、この特定の値を使用する必要があり、2つのメソッドは単なる定型文です。 –

+0

これを特別なケースにすることは避けたいと思います。デフォルト値のメソッド呼び出しを挿入するとき、コンパイラは現在、メソッド名とシグニチャを知る必要があります。 –

関連する問題