Tôi muốn gọi phương thức java sau từ scala:làm thế nào để vượt qua một String * scala vararg đến một phương pháp java sử dụng Scala 2,8
protected final FilterKeyBindingBuilder filter(String urlPattern, String... morePatterns) {
return filtersModuleBuilder.filter(Lists.newArrayList(urlPattern, morePatterns));
}
gọi scala của tôi trông như thế này
def test(url: String, urls: String*) {
filter(url, urls: _*).through(classOf[MyTestWhateverFilter])
}
biên dịch này, tuy nhiên, thực thi mã cho một ngoại lệ:
java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String;
Tôi cũng đã thử điều này:
def test(url: String, urls: String*) {
filter(url, urls.map(_.asInstanceOf[java.lang.String]) :_*).through(classOf[MyTestWhateverFilter])
}
trong trường hợp này ngoại trừ là:
java.lang.ClassCastException: scala.collection.mutable.ArrayBuffer cannot be cast to [Ljava.lang.String;
Tôi nghĩ rằng trong 2,8 Array [Chuỗi] được chuyển cho java như String [] mảng và không unboxing thêm là cần thiết.
Bất kỳ ý tưởng nào?
Cảm ơn trước!
EDIT:
làm thế nào để tái tạo nó:
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
kết quả:
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)
Tôi đã thử nó với ví dụ của bạn nó dường như làm việc. hmm không chắc tại sao gọi phương thức của guice servlet lại tạo nên sự khác biệt. – poko
(đã thêm ví dụ) – poko
thú vị! Tôi có thể báo cáo lỗi này là lỗi – poko