Scala类构造函数';s的默认参数命名
我需要使用反射实例化Scala类 我想使用带有默认值的参数的类默认构造函数,所以我需要获得这些默认值 Scala中的默认值只是JVM中的方法,所以我需要获取所有类方法并只调用那些返回默认值的方法 问题:我发现返回默认参数值的方法有两种不同的命名约定-“应用$default$X”和“$lessinit$greater$default$X”(其中X是特定参数的位置数)。 这两者有什么区别?Scala类构造函数';s的默认参数命名,scala,reflection,Scala,Reflection,我需要使用反射实例化Scala类 我想使用带有默认值的参数的类默认构造函数,所以我需要获得这些默认值 Scala中的默认值只是JVM中的方法,所以我需要获取所有类方法并只调用那些返回默认值的方法 问题:我发现返回默认参数值的方法有两种不同的命名约定-“应用$default$X”和“$lessinit$greater$default$X”(其中X是特定参数的位置数)。 这两者有什么区别? 可能这取决于Scala版本或其他什么?如果您声明一个case类 case class Foo(bar: Int
可能这取决于Scala版本或其他什么?如果您声明一个case类
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
方法返回(因为构造函数的名称是
)apply$default$X
是apply
方法的默认值
对于非案例类,除非您自己定义了
apply
方法,否则您只能看到$lessinit$greater$default$X
如果您声明一个case类
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
方法返回(因为构造函数的名称是
)apply$default$X
是apply
方法的默认值
对于非案例类,除非您自己定义了
apply
方法,否则您只能看到$lessinit$greater$default$X
但还有一个问题:为什么apply()和apply()都有两种不同的默认值方法?若我声明类Foo(bar:Int=0),那个么伴生对象也应该使用这个特定的值,并且两个方法只是一个样板。我假设这只是为了避免使它成为一个特例。当插入默认值方法调用时,编译器当前只需要知道方法名称和签名。但是还有一个问题:为什么apply()和apply()都有两个不同的默认值方法?若我声明类Foo(bar:Int=0),那个么伴生对象也应该使用这个特定的值,并且两个方法只是一个样板。我假设这只是为了避免使它成为一个特例。插入默认值方法调用时,编译器当前只需要知道方法名称和签名。