Scala类构造函数的默认参数命名

时间:2016-09-23 09:24:14

标签: scala reflection

我需要使用反射来实例化Scala类。

我想使用具有默认值参数的类默认构造函数,因此我需要获取这些默认值。

Scala中的默认值只是JVM中的方法,因此我需要获取所有类方法并仅调用那些返回默认值。

问题:我发现返回默认arg值的方法有两种不同的命名约定 - “应用$ default $ X ”和“ $ lessinit $ greater $ default $ X “(其中X是特定参数的位置数)。 这两者有什么区别? 也许这取决于Scala版本或其他什么?

1 个答案:

答案 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$Xapply方法的默认值。

对于非案例类,您应该只看到$lessinit$greater$default$X,除非您自己定义apply方法。