2017-04-01 7 views
0

ich habe:Scala Klasse Casting

var className = "scala.collection.immutable.List" 
val clazz = Class.forName(className) 
val value = ArrayBuffer(1, 2, 3) 

so die Frage ist, wie Wert Klasse zu werfen, wenn classname Variable ist? Ich kann tun

nicht
value.asInstanceOf[clazz.type] 

aber ich

value.toList 

und es macht den Job mit implizite Konvertierung Methode aufrufen kann, aber wie kann ich diese Methode finden und aufrufen können, wenn classname Variable ist?

+0

Parameter in 'asInstanceOf' kann nicht mit einer Variablen dargestellt werden, es ist eine Kompilierzeiteinheit. 'clazz.type'-Wert OTOH existiert nur zur Laufzeit. –

+0

Danke, Kappe. Die Frage ist, wie man ArrayBuffer (1, 2, 3) zur Laufzeit in List umwandelt, wenn ich nur className habe ... –

+0

Ich denke nicht, dass es klug ist, was du tust, aber hier ist es: https: // docs. oracle.com/javase/7/docs/api/java/lang/Class.html#cast(java.lang.Object) –

Antwort

1

Ich weiß nicht, eine magische Art und Weise von ArrayBuffer für jede Sammlung zu konvertieren, aber Sie können getMethod rufen Sie die toList Methode zu finden und aufzurufen:

val method = value.getClass.getMethod("toList") 
method.invoke(value) 

Eine Ausnahme wird, wenn toList in nicht gefunden geworfen werden in Wert. Ich hätte es vorgezogen, meine Antwort zu kommentieren, aber nicht genug Reputation