Je suis déchirer mes cheveux à essayer de comprendre comment effectuer les opérations suivantes:Utilisation varargs de Scala
def foo(msf: String, o: Any, os: Any*) = {
println(String.format(msf, o :: List(os:_*)))
}
Il y a une raison pour laquelle je dois déclarer avec un o
et un os
Seq
séparément. Fondamentalement, je me retrouve avec la méthode de format appelée avec un seul paramètre d'objet (de type List
). Tentative:
def foo(msf: String, o: Any, os: Any*) = {
println(String.format(msf, (o :: List(os:_*))).toArray)
}
me donne l'erreur de type:
found: Array[Any]
required Seq[java.lang.Object]
J'ai essayé casting, qui compile mais échoue pour à peu près la même raison que le premier exemple. Lorsque je tente
println(String.format(msg, (o :: List(os:_*)) :_*))
ce ne parvient pas à compiler avec l'ambiguïté de conversion implicite (any2ArrowAssoc
et any2stringadd
)
Il compile, mais tombe à l'exécution: Exception dans le thread "principal" java.lang.ClassCastException. Scala côlon $ côlon $ ne peut pas être jeté à scala.runtime.BoxedObjectArray \t à scala.runtime.RichString .format (RichString.scala: 242) –
Aussi, d'où vient toList? –
Correction, cela fonctionne maintenant. Je dépose un rapport de bogue - Scala ne devrait pas avoir d'exception ClassCast sauf si vous avez utilisé asInstanceOf. toList est une méthode sur Iterable [A] –