È possibile farlo con la riflessione in 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)
E se si vuole che sia facile a Scala si può fare una classe che fa per voi, oltre a un implicito per la conversione:
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")
Fare questo genere di cose converte gli errori in fase di compilazione in errori di runtime, tuttavia (vale a dire essenzialmente aggira il sistema di tipi), quindi usare con cautela.
(Edit:. E vedere l'uso della NameTransformer nel link qui sopra - aggiungendo che vi aiuterà se si tenta di utilizzare gli operatori)
fonte
2010-01-13 21:44:12
sto errore di salire sul seguente 'List (1, 2) chiamata ("prendere", 1)' 'L'errore è di tipo. mismatch; found: Int (1) richiesto: AnyRef Nota: esiste un implicito da scala.Int => java.lang.Integer, ma i metodi ereditati da Object sono resi ambigui. Questo per evitare impliciti di copertina che convertono in qualsiasi scala .Int a qualsiasi AnyRef. Potresti voler usare un attributo di tipo: x: java.lang.Integer. C'è un modo per gestire i tipi primitivi? (Voglio generare dinamicamente l'elenco degli argomenti ... potrebbe essere una lista di 'Any') – dips
@dips - Puoi' .asInstanceOf [AnyRef] 'per la via in (funziona anche con' Any'), o '1: java.lang.Integer' come suggerisce l'errore. Oppure puoi abbinare le primitive e gestisci caso per caso se davvero ne hai bisogno, anche se non dovresti aver bisogno di qui. –
Grazie! Quindi la firma della funzione 'call' ora richiede' args: Any * 'e lo converto in' AnyRef * 'nel corpo di' call' come 'args map {_.asInstanceOf [AnyRef]}'. Spero che vada bene. Non so le sottigliezze, quindi chiedendo. – dips