有没有办法动态实例化指定了一个或多个默认参数的Scala案例类?
我正在寻找与此相同的动态(基于反射):
case class Foo( name:String, age:Int = 21 )
val z = Foo("John")
现在,如果我尝试这个,我会得到一个例外:
val const = Class.forName("Foo").getConstructors()(0)
val args = Array("John").asInstanceOf[Array[AnyRef]]
const.newInstance(args:_*)
如果我在参数数组中添加age的值,没问题。
答案 0 :(得分:1)
您可以在运行时将默认参数作为对象的方法。
如果是构造函数参数 - 伴随对象方法(scala 2.9.3)。
$ echo 'class Test(t: Int = 666)' > test.scala
$ scalac -Xprint:typer test.scala
...
<synthetic> def init$default$1: Int @scala.annotation.unchecked.uncheckedVariance = 666
您不能依赖此方法的名称。 (scala 2.10.1):
scala> Test.$lessinit$greater$default$1
res0: Int = 666
我don't know如何获取构造函数的默认参数,但在case class
的情况下,您可以获得apply
方法默认参数。请参阅this answer。
答案 1 :(得分:0)
具有默认值的参数是编译时的事情。编译器将为缺少参数的调用提供默认值。反射没有这样的东西,尤其是java反射,它完全不知道默认参数。