2017-04-01 1 views
0

Je:Scala casting de classe

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

si la question est de savoir comment jeter la valeur à la classe, si className est variable? Je ne peux pas faire

value.asInstanceOf[clazz.type] 

mais je peux appeler

value.toList 

et il fait le travail avec la méthode de conversion implicite, mais comment je peux trouver et invoquer cette méthode lorsque className est variable?

+0

Le paramètre dans 'asInstanceOf' ne peut pas être représenté avec une variable, c'est une entité à la compilation. Valeur 'clazz.type' OTOH n'existe qu'au moment de l'exécution. –

+0

Thanx, cap. La question est de savoir comment lancer ArrayBuffer (1, 2, 3) en List à l'exécution quand je n'ai que className ... –

+0

Je ne pense pas que ce que vous faites soit sage mais voici: https: // docs. oracle.com/javase/7/docs/api/java/lang/Class.html#cast(java.lang.Object) –

Répondre

1

Je ne sais pas un moyen magique pour convertir ArrayBuffer à toute collection, mais vous pouvez appeler getMethod pour localiser et appeler la méthode toList:

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

Une exception sera levée si toList dans introuvable en valeur. J'aurais préféré commenter ma réponse, mais pas assez de réputation