带有默认参数的Scala动态实例化



是否有一种方法可以动态实例化一个指定了一个或多个默认参数的Scala case类?

我正在寻找动态的(基于反射的)等价物:

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的值,没有问题

您可以在运行时获取默认参数作为对象的方法。

在构造函数参数-伴随对象方法(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

我不知道如何获得构造函数的默认参数,但在case class的情况下,您可以获得apply方法的默认参数。

带默认值的参数是编译时的东西。编译器将为缺少形参的调用提供默认值。反射没有这样的事情,更不用说java反射了,它根本不知道默认参数。

相关内容

  • 没有找到相关文章

最新更新