我可以通过反射检索一个方法,以某种方式将它与一个目标对象结合起来,然后将它作为一个看起来像 Scala 中的函数的东西返回(即你可以使用括号调用它)?参数列表是可变的。它不必是“一流”函数(我已经更新了问题),只是一个看起来像语法的函数调用,例如 f(args)。
到目前为止,我的尝试看起来是这样的(从技术上讲,这是伪代码,只是为了避免在帖子中添加额外的定义):
类method_ref(o:AnyRef,m:java.lang.reflect.Method){ def apply(args: Any*): some_return_type = { var oa: Array[Object] = args.toArray.map { _.asInstanceOf[Object] } println("调用:" + m.toString + " with: " + oa.length) m.invoke(o, oa: _*) 匹配 { 案例 x: some_return_type => x; case u => throw new Exception("unknown result" + u); } } }
有了上面我能够克服编译器错误,但现在我有一个运行时异常:
引起:java.lang.IllegalArgumentException:参数类型不匹配
示例用法类似于:
var f = ...一些表达式返回method_ref ...; ... var y = f(x) // 看起来像一个函数,不是吗?
更新
将 args:Any* 更改为 args:AnyRef* 实际上修复了我的运行时问题,因此上述方法(带有修复)适用于我想要完成的工作。我想我在这里遇到了一个更普遍的可变参数问题。