我知道我可以针对instanceOfFunction1等进行Function2检查,但是有一种通用的方法来查看某项功能是否有效(它可以具有任意数量的args)。我试图定义这样的事情:

type FuncType = (Any*) -> Any

但这也不起作用。基本上我有一些看起来像这样的代码:
call = (name: Any, args: Any*) -> if name.isFunction then name.castAs[Function].apply(args) else name
aFunction = (name: String) => "Hello " + name
notAFunction = "Hello rick"
call(aFunction, "rick")
call(notAFunction)

最佳答案

不,除了检查并检查每个Function1Function2等外,没有其他方法。这些特征的父级是AnyRef,这不会帮助您将它们与其他特征区分开。这些特征中的每个特征的apply方法采用不同数量的参数,因此无法为它们提供具有apply方法的父级。您可能最接近的方法是:

def arbitraryFunction(function: AnyRef, args: Seq[Any]): Any = {
  function match {
    case f: Function1[Any, Any] => f(args(0))
    case f: Function2[Any, Any, Any] => f(args(0), args(1))
    // and so on
  }
}

但这是疯狂和危险的,如果类型错误,例如在运行时会在运行时抛出异常。
arbitraryFunction((x: Int) => x * 2, List("I'm a String!"))

关于scala - Scala中所有函数的父类(super class)型是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18544330/

10-10 04:04