Sen Java yansıması ile yapabilirsiniz
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")
Bu tür bir şey yapmak, derleme zamanı hatalarını çalışma zamanı hatalarına dönüştürür, ancak (aslında, sistem türünü siler), bu nedenle dikkatli kullanın.
(Düzenleme:. Ve yukarıdaki bağlantıda NameTransformer kullanımını bakınız - Eğer operatörlerini kullanmaya çalışırsanız yardımcı olacağını ekleme)
'listesi (1, 2) çağrısı ("al" 1)' hatadır 'türü. bulunamadı: Int (1) gerekli: AnyRef Not: bir örtülü var scala.Int => java.lang.Integer, ancak Object'ten devralınan yöntemler belirsiz hale getirilir.Bu, bir örtülü örtüyü önlemek için hangi herhangi bir scala dönüştürebilirsiniz Herhangi bir AnyRef için.Aşağıdaki yazı tipini kullanmak isteyebilirsiniz: x: java.lang.Integer.' İlkel türleri ele almak için bir yol var mı? (Ben dinamik olarak argüman listesi oluşturmak istiyorum ... bir liste olabilir 'Any'' – dips
@dips - Eğer' '' '' ile de çalışır .sIstanceOf [AnyRef] '', ya da hata önerileri gibi '1: java.lang.Integer' yapabilirsiniz. ve gerçekten ihtiyacınız varsa, burada olmanıza gerek kalmasa da, büyük/küçük harflerle dava açabilirsiniz. –
Teşekkürler! Yani 'çağırma 'işlev imzamı şimdi alır' args: Any *' ve ben 'call' gövdesinde' Any'''''''''' '' '{{}} {{}}} {}. Umarım bu iyidir. Inceliklerini bilmiyorum, bu yüzden soruyor. – dips