2016-09-23 65 views
0

我需要使用反射來實例化Scala類。Scala類構造函數的默認參數命名

我想使用類默認構造函數的參數與默認值,所以我需要得到這些默認值。

Scala中的默認值只是JVM中的方法,所以我需要獲取所有類方法並只調用那些返回默認值。

的問題:我看到有對返回默認的arg值法兩種不同的命名約定 - 「申請$默認$ X」和「$ lessinit $更大$默認$ X」(其中X是特定參數的多個位置)。 這兩者有什麼區別? 也許它取決於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$Xapply方法的默認值。

對於非案例類,您應該只能看到$lessinit$greater$default$X,除非您自己定義了apply方法。

+0

我明白了,謝謝! –

+0

但還有一個問題:爲什麼apply()和有兩種不同的默認值方法? 如果我聲明類Foo(bar:Int = 0)比伴侶對象還應該使用這個特定的值,兩種方法只是一個樣板。 –

+0

我認爲這只是爲了避免使這個特例。當插入默認值方法調用時,編譯器當前只需要知道方法名稱和簽名。 –

相關問題