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