quisiera llamar al siguiente método Java desde Scala:cómo pasar una scala vararg String * a un método Java utilizando Scala 2,8
protected final FilterKeyBindingBuilder filter(String urlPattern, String... morePatterns) {
return filtersModuleBuilder.filter(Lists.newArrayList(urlPattern, morePatterns));
}
mi Scala persona que llama se ve así
def test(url: String, urls: String*) {
filter(url, urls: _*).through(classOf[MyTestWhateverFilter])
}
esto compila, sin embargo, la ejecución del código da una excepción:
java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String;
también probé esto:
def test(url: String, urls: String*) {
filter(url, urls.map(_.asInstanceOf[java.lang.String]) :_*).through(classOf[MyTestWhateverFilter])
}
en este caso la excepción fue:
java.lang.ClassCastException: scala.collection.mutable.ArrayBuffer cannot be cast to [Ljava.lang.String;
pensé que en 2.8 Array [String] se pasa a java como cadena array [] y no unboxing extra es necesario.
¿Alguna idea?
¡Gracias de antemano!
EDIT:
cómo replicarlo:
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
resultado:
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)
Lo probé con su ejemplo, parece que funciona. No estoy seguro de por qué llamar al método de servlet de Guice hace la diferencia. – poko
(agregó un ejemplo) – poko
¡Interesante! Podría reportar esto como un error – poko