Scala List [Int] становится списком <Object>в Java - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть следующий список, определенный в объекте Scala:

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

, который, кажется, становится scala.collection.immutable.List<Object>, когда я пытаюсь использовать его из Java.Как следствие, я должен использовать геттеры типа Foo.bar().apply$mcII$sp(i) или apply с приведением к Integer / int.

Почему универсальный тип Object, а не Integer?Это также, кажется, имеет место только для типов, которые существуют как примитивы Java;List[MyType] становится List<MyType> в Scala.

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

У меня была похожая проблема с Swagger, который плохо реагировал на Scala.

Я не знаю, почему , но эта ошибка / функция связана с примитивами Java, которые не имеют сеттеров и геттеров (например, объектов).Поскольку компилятор Java не может найти подходящий объект, он просто компилирует его в Object.

В коллекциях Scala есть конвертеры, чтобы исправить это: https://docs.scala -lang.org / обзор / коллекции / переходы-между-java-and-scala-collection.html

Единственный обходной путь, о котором я могу подумать, это использовать: Foo.bar.toJava

Источники: Десериализация списка Scala с Джексоном

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

Модуль форматирования Spring RequestParam для Scala.Option

Удачи!

0 голосов
/ 21 ноября 2018

Это происходит из-за того, что 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], это привело бы к List<Integer> в Java вместо List<Object>

0 голосов
/ 21 ноября 2018

Попробуйте использовать декоратор коллекции asJava:

val javabar = bar.asJava
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...