我需要使用反射来实例化Scala类。
我想使用具有默认值参数的类默认构造函数,因此我需要获取这些默认值。
Scala中的默认值只是JVM中的方法,因此我需要获取所有类方法并仅调用那些返回默认值。
问题:我发现返回默认arg值的方法有两种不同的命名约定 - “应用$ default $ X ”和“ $ lessinit $ greater $ default $ X “(其中X是特定参数的位置数)。 这两者有什么区别? 也许这取决于Scala版本或其他什么?
答案 0 :(得分:2)
如果您声明案例类
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
方法的默认值。
对于非案例类,您应该只看到$lessinit$greater$default$X
,除非您自己定义apply
方法。