如何将任意方法调用为任何类型,参数列表为Any *?

时间:2015-01-14 20:30:06

标签: scala

如果方法是一个可以接受参数中的参数数量的函数,我将如何在Scala中实现以下方法?

def applyAny(method: Any, arguments: Any*) = ???

我的目的是与scala.Dynamic结合使用,如下所示:

val dynamicValue: Dynamic
dynamicValue.myAdd = (x,y) = > x + y
dynamicValue.myAdd(2,3)

1 个答案:

答案 0 :(得分:1)

我从您的示例代码段中获取它,您希望这些“方法”成为23种FunctionN类型之一。

在这种情况下,除了在上述23种类型上使用运行时调度之外,你无能为力:

def applyAny(method: Any, arguments: Any*): Any = (arguments.size, method) match {
  case (0, f: Function0[_]) =>
    f()
  case (1, f: Function1[_, _]) =>
    f.asInstanceOf[Function1[Any, Any]](arguments(0))
  case (2, f: Function2[_, _, _]) =>
    f.asInstanceOf[Function2[Any, Any, Any]](arguments(0), arguments(1))
  ...
  case (22, f: Function22[_, _, ..., _]) =>
    f.asInstanceOf[Function22[Any, Any, ..., Any]](arguments(0), arguments(1), ..., arguments(21))
  case _ =>
    sys.error("Arity mismatch")
}

并不漂亮,并且ClassCastException在运行时在各个地方都有很多机会。