我在Scala对象中定义了以下列表:
object Foo {
val bar = List(1, 2, 3)
}
当我尝试从Java中使用它时,它似乎变成了scala.collection.immutable.List<Object>
。因此,我不得不使用像Foo.bar().apply$mcII$sp(i)
或apply
这样的getter,并将其强制转换为Integer
/int
。
为什么泛型类型是Object
而不是Integer
?这似乎也只是作为Java原语存在的类型的情况;在Scala中List[MyType]
变成了List<MyType>
。
我也遇到过类似的问题,Swagger对Scala的响应不好。
我不知道为什么,但这个bug/特性与Java的基元有关,这些基元没有setter和getter(比如对象(。由于Java编译器找不到合适的对象,所以它只将其编译为object。
Scala集合制作了转换器来解决这个问题:https://docs.scala-lang.org/overviews/collections/conversions-between-java-and-scala-collections.html
我能想到的唯一解决方法是使用:Foo.bar.toJava
来源:用Jackson 反序列化Scala列表
https://stackoverflow.com/a/52581955/2291510
Scala的Spring RequestParam格式化程序。选项
祝你好运!
这是因为Java不支持泛型类型中的基元类型,泛型仅在Java中是编译时构造,它们不存在于JVM字节码中,因此它们必须转换为Java的Object
类型,而基元不能。
如果我们使用-Xprint:jvm
标志编译代码,您可以看到List[Int]
实际上编译为非通用List
:
package com.yuvalitzchakov.github {
object Foo extends Object {
private[this] val bar: List = _;
<stable> <accessor> def bar(): List = Foo.this.bar;
def <init>(): com.yuvalitzchakov.github.Foo.type = {
Foo.super.<init>();
Foo.this.bar = scala.collection.immutable.List.apply(scala.Predef.wrapIntArray(Array[Int]{1, 2, 3}));
()
}
}
}
如果Foo.bar
是List[Integer]
,这将在Java中生成List<Integer>
,而不是List<Object>
尝试使用集合装饰器asJava:
val javabar = bar.asJava