我可以通过反射检索一个方法,以某种方式将它与目标对象合并,并将其作为Scala中的函数返回(即,您可以使用圆括号调用它)?参数列表是可变的。它不一定是“头等舱”功能(我更新了问题),而只是一个看起来语法上的函数调用,例如, F(参数)。是否有一种简单(惯用)的方式将java.lang.reflect.Method转换为Scala函数?
我尝试到目前为止看起来是这样的(这在技术上是伪代码,只是为了避免弄乱了新的定义后):
class 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("calling: " + m.toString + " with: " + oa.length) m.invoke(o, oa: _*) match { case x: some_return_type => x; case u => throw new Exception("unknown result" + u); } } }
通过以上我能闯过编译错误,但现在我有一个运行时异常:
Caused by: java.lang.IllegalArgumentException: argument type mismatch
的例子用法是一样的东西:
var f = ... some expression returning method_ref ...; ... var y = f(x) // looks like a function, doesn't it?
UPDATE
更改ARGS:任何*成参数:AnyRef *居然修好了我的运行时间问题,因此上述方法(与修订)工作正常,我试图完成。我想我在这里遇到了可变参数更普遍的问题。
哦......我错过了关于“简单”的事情。不,没有。曾经,但它是实验性的,并被放弃。 – 2010-04-18 05:12:19
你可以随时解释_where_你得到错误,因为你发布的method_ref不会被编译。 – 2010-04-18 13:39:48
它实际上看起来像改变Any * AnyRef *解决了我的问题,但我不明白为什么。 – 2010-04-18 23:06:52