Scala List[Int] 在<Object> Java 中成为 List



我在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.barList[Integer],这将在Java中生成List<Integer>,而不是List<Object>

尝试使用集合装饰器asJava:

val javabar = bar.asJava

相关内容

最新更新