Je voudrais appeler la méthode java suivante à partir scala:comment passer une chaîne * scala vararg à une méthode Java en utilisant Scala 2.8
protected final FilterKeyBindingBuilder filter(String urlPattern, String... morePatterns) {
return filtersModuleBuilder.filter(Lists.newArrayList(urlPattern, morePatterns));
}
mon appelant scala ressemble à ceci
def test(url: String, urls: String*) {
filter(url, urls: _*).through(classOf[MyTestWhateverFilter])
}
cette compile, cependant, l'exécution du code donne une exception:
java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String;
J'ai aussi essayé ceci:
def test(url: String, urls: String*) {
filter(url, urls.map(_.asInstanceOf[java.lang.String]) :_*).through(classOf[MyTestWhateverFilter])
}
dans ce cas, l'exception était:
java.lang.ClassCastException: scala.collection.mutable.ArrayBuffer cannot be cast to [Ljava.lang.String;
Je pensais que dans 2.8 Array [chaîne] est passé à Java sous forme de tableau String [] et aucun unboxing supplémentaire est nécessaire.
Des idées?
Merci d'avance!
EDIT:
comment répliquer:
import com.google.inject.servlet.ServletModule
trait ScalaServletModule extends ServletModule{
def test(s: String,strs: String*) = {
println(strs.getClass)
println(super.filter(s,strs:_*))
}
}
object Test {
def main(args: Array[String]) {
val module = new ServletModule with ScalaServletModule
module.test("/rest")
}
}
/opt/local/lib/scala28/bin/scala -cp /Users/p.user/Downloads/guice-2.0/guice-2.0.jar:/Users/p.user/Downloads/guice-2.0/guice-servlet-2.0.jar:/Users/p.user/Downloads/guice-2.0/aopalliance.jar:/Users/p.user/Downloads/javax.jar/javax.jar:. Test
Résultat:
class scala.collection.mutable.WrappedArray$ofRef
java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String;
at ScalaServletModule$class.test(test.scala:6)
at Test$$anon$1.test(test.scala:11)
at Test$.main(test.scala:12)
at Test.main(test.scala)
Je l'ai essayé avec votre exemple, il semble fonctionner. hmm ne sais pas pourquoi appeler la méthode de ce servlet de guice fait une différence. – poko
(ajouté un exemple) – poko
intéressant! Je pourrais rapporter ceci comme un bogue – poko