2016-09-23 12 views
0

Ich muss Scala-Klasse instanziieren mit Reflexion.Scala Klassenkonstruktor die Standard-Argument Benennung

Ich möchte Klassenstandardkonstruktor verwenden, der Argumente mit Standardwerten hat, also muss ich diese Standardwerte erhalten.

Standardwerte in Scala sind nur Methoden in JVM, daher muss ich alle Klassenmethoden abrufen und nur die Standardwerte für die Rückgabe aufrufen.

Die Frage: Ich sehe, dass es zwei verschiedene Namenskonventionen für Methoden sind die Standards arg Werte zurückgibt - und „$ lessinit $ größer $ Standard $ X“ (wobei X „$ Standard $ X anwenden“ ist eine Nummer der Position eines bestimmten Arguments). Was ist der Unterschied zwischen diesen beiden? Vielleicht hängt es von der Scala-Version oder etwas anderem ab?

Antwort

1

Wenn Sie deklarieren eine Fallklasse

case class Foo(bar: Int) 

dann das schafft sowohl eine normale Klasse und ein Begleitobjekt:

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

Natürlich, wenn Sie Standard-Parameterwerte, sowohl der Konstruktor und die apply Methode muss diese Standardwerte verwenden; jedes andere Verhalten wäre ziemlich überraschend.

So die Standardwerte des Konstruktors werden von $lessinit$greater$default$X Methoden zurückgegeben (da der Name des Konstruktors ist). apply$default$X sind die Standardwerte für die Methode apply.

Für nicht-fallbezogene Klassen sollten Sie nur $lessinit$greater$default$X sehen, es sei denn, Sie definieren die apply-Methode selbst.

+0

Ich habe es, danke! –

+0

Aber zusätzliche Frage: Warum gibt es zwei verschiedene Standard-Wert-Methoden für beide apply() und ? Wenn ich Klasse Foo (bar: Int = 0) deklariere als Companion-Objekt sollte auch diesen bestimmten Wert verwenden und zwei Methoden ist nur ein Muster. –

+0

Ich gehe davon aus, dass dies nur ein Sonderfall ist. Wenn der Compiler die Methoden der Standardwerte aufruft, muss er nur den Methodennamen und die Signatur kennen. –

Verwandte Themen