我可以通過反射檢索一個方法,以某種方式將它與目標對象合併,並將其作爲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