Могу ли я получить метод через отражение, каким-то образом объединить его с целевым объектом и вернуть его как что-то похожее на функцию в 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
Изменение арг: Любой * в аргументах: AnyRef * фактически фиксированная моя проблема времени выполнения, поэтому выше подход (с исправлением) штраф за то, что я пытаюсь выполнить работы. Думаю, я столкнулся с более общей проблемой с варгарами.
Ох ... Я пропустил дело о «легком». Нет, нет. Раньше, но он был экспериментальным и был отброшен. –
Вы всегда можете объяснить _where_, у вас есть ошибка, так как метод_ref, который вы отправили, не будет компилироваться. –
На самом деле это похоже на изменение Any * на AnyRef * исправлено мою проблему, хотя я не понимаю, почему. –