Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala类构造函数';s的默认参数命名_Scala_Reflection - Fatal编程技术网

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

Scala类构造函数';s的默认参数命名,scala,reflection,Scala,Reflection,我需要使用反射实例化Scala类 我想使用带有默认值的参数的类默认构造函数,所以我需要获得这些默认值 Scala中的默认值只是JVM中的方法,所以我需要获取所有类方法并只调用那些返回默认值的方法 问题:我发现返回默认参数值的方法有两种不同的命名约定-“应用$default$X”和“$lessinit$greater$default$X”(其中X是特定参数的位置数)。 这两者有什么区别? 可能这取决于Scala版本或其他什么?如果您声明一个case类 case class Foo(bar: Int

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

我想使用带有默认值的参数的类默认构造函数,所以我需要获得这些默认值

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

问题:我发现返回默认参数值的方法有两种不同的命名约定-“应用$default$X”和“$lessinit$greater$default$X”(其中X是特定参数的位置数)。 这两者有什么区别?
可能这取决于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),那个么伴生对象也应该使用这个特定的值,并且两个方法只是一个样板。我假设这只是为了避免使它成为一个特例。插入默认值方法调用时,编译器当前只需要知道方法名称和签名。