リフレクションを介してメソッドを取得し、何らかの方法でそれをターゲット オブジェクトと組み合わせて、Scala の関数のように見えるものとして返すことはできますか (つまり、括弧を使用して呼び出すことができます)? 引数リストは可変です。「ファーストクラス」の関数である必要はありません (質問を更新しました)。f(args) など、構文的に見える関数呼び出しだけです。
これまでの私の試みは次のようになります (これは技術的には疑似コードであり、追加の定義で投稿が混乱するのを避けるためです):
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: _*) 一致 { ケース 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* に変更すると、実行時の問題が実際に修正されたので、上記のアプローチ (修正を含む) は、私が達成しようとしていたことに対してうまく機能します。ここで可変引数に関するより一般的な問題に遭遇したと思います。