Вы можете сделать это с помощью отражения в Java:
class A {
def cat(s1: String, s2: String) = s1 + " " + s2
}
val a = new A
val hi = "Hello"
val all = "World"
val method = a.getClass.getMethod("cat",hi.getClass,all.getClass)
method.invoke(a,hi,all)
И если вы хотите, чтобы в Scala это было легко, вы можете создать класс, который сделает это за вас, плюс неявный для преобразования:
case class Caller[T>:Null<:AnyRef](klass:T) {
def call(methodName:String,args:AnyRef*):AnyRef = {
def argtypes = args.map(_.getClass)
def method = klass.getClass.getMethod(methodName, argtypes: _*)
method.invoke(klass,args: _*)
}
}
implicit def anyref2callable[T>:Null<:AnyRef](klass:T):Caller[T] = new Caller(klass)
a call ("cat","Hi","there")
Подобные действия преобразуют ошибки времени компиляции в ошибки времени выполнения (т. Е. По существу обходят систему типов), поэтому используйте их с осторожностью.
(Изменить: и посмотреть использование NameTransformer по ссылке выше - добавление, которое поможет, если вы попытаетесь использовать операторы.)