mam łzawienie moje włosy próbuje dowiedzieć się, jak wykonać następujące czynności:Korzystanie varargs od Scala
def foo(msf: String, o: Any, os: Any*) = {
println(String.format(msf, o :: List(os:_*)))
}
Jest powód, dlaczego muszę zadeklarować metodę z o
i os
Seq
oddzielnie. Zasadniczo kończę z metodą formatowania wywołaną z jednym parametrem obiektu (typu List
). Próba:
def foo(msf: String, o: Any, os: Any*) = {
println(String.format(msf, (o :: List(os:_*))).toArray)
}
daje mi błąd typu:
found: Array[Any]
required Seq[java.lang.Object]
próbowałam casting, który kompiluje ale nie powiedzie się prawie z tego samego powodu, jak w pierwszym przykładzie. Kiedy próbuję
println(String.format(msg, (o :: List(os:_*)) :_*))
to nie skompilować z niejawnego dwuznaczności konwersji (any2ArrowAssoc
i any2stringadd
)
To kompiluje ale przewraca się w czasie wykonywania: wyjątek w wątku "main" java.lang.ClassCastException. Scala $ okrężnicy $ okrężnicy nie mogą być oddane do scala.runtime.BoxedObjectArray \t w scala.runtime.RichString .format (RichString.scala: 242) –
Również skąd pochodzi toList? –
Naprawiono, działa teraz. Zgłaszam raport o błędzie - Scala nie powinna mieć zastrzeżeń ClassCastExceptions, z wyjątkiem sytuacji, gdy korzystasz z asInstanceOf. toList to metoda na Iterable [A] –