【问题标题】:Scala List[Int] becomes List<Object> in JavaScala List[Int] 在 Java 中变成 List<Object>
【发布时间】:2018-11-21 12:00:41
【问题描述】:

我在 Scala 对象中定义了以下列表:

object Foo {
    val bar = List(1, 2, 3)
}

当我尝试从 Java 中使用它时,它似乎变成了 scala.collection.immutable.List&lt;Object&gt;。因此,我必须使用像 Foo.bar().apply$mcII$sp(i)apply 这样的 getter 并转换为 Integer/int

为什么泛型类型是Object 而不是Integer?这似乎也仅适用于作为 Java 原语存在的类型。 List[MyType] 在 Scala 中变为 List&lt;MyType&gt;

【问题讨论】:

  • @StuartLC 在我的 IDE 中的设计期间。我只是想知道为什么非基元不会发生这种情况,例如,List[MyType] 在 Java 中变为 List&lt;MyType&gt;

标签: java scala


【解决方案1】:

我遇到过类似的问题,即 Swagger 对 Scala 反应不佳。

我不知道为什么,但是这个错误/功能与没有 setter 和 getter(如对象)的 Java 原语有关。由于 Java 编译器找不到合适的对象,它只是将其编译为 Object。

Scala 集合已经制作了转换器来解决这个问题:https://docs.scala-lang.org/overviews/collections/conversions-between-java-and-scala-collections.html

我能想到的唯一解决方法是使用: Foo.bar.toJava

来源: Deserializing Scala list with Jackson

https://stackoverflow.com/a/52581955/2291510

Spring RequestParam formatter for Scala.Option

祝你好运!

【讨论】:

    【解决方案2】:

    这是因为Java does not support primitive types in generic types,泛型仅在 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&lt;Integer&gt;,而不是List&lt;Object&gt;

    【讨论】:

    • 你知道为什么它不编译成对应的原始包装类型如Integer吗?
    • @beatngu13 这是一个很好的问题,我实际上不知道为什么包装器类型没有自动提升(除非我们用List[Integer] 类型明确地注释bar)。
    【解决方案3】:

    尝试使用集合装饰器作为Java:

    val javabar = bar.asJava
    

    【讨论】:

    • 我知道这将是解决问题的方法。我只是想知道为什么 Scala List[Int] 被编译为 List&lt;Object,即为什么要泛化为 Object
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2017-09-30
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多