Я изучаю Scala, и у меня есть проект Java для перехода на Scala. Я хочу перенести его путем перезаписи классов один за другим и проверки того, что новый класс не нарушил проект.
В этом Java-проекте используются много java.util.List и java.util.Map. В новых классах Scala я хотел бы использовать Scala s List и Map, чтобы иметь красивый код Scala.
Проблема в том, что новые классы (те, что написаны в Scala) не интегрируются без использования существующего Java-кода: Java нуждается в java.util.List, Scala нуждается в собственном scala.List.
Вот упрощенный пример проблемы. Есть классы Main, Logic, Dao. Они называют друг друга в строке: Главная → Логика → Дао.
public class Main {
    public void a() {
        List<Integer> res = new Logic().calculate(Arrays.asList(1, 2, 3, 4, 5));
    }
}
public class Logic {
    public List<Integer> calculate(List<Integer> ints) {
        List<Integer> together = new Dao().getSomeInts();
        together.addAll(ints);
        return together;
    }
}
public class Dao {
    public List<Integer> getSomeInts() {
        return Arrays.asList(1, 2, 3);
    }
}
В моей ситуации классы Main и Dao являются рамковыми классами (мне не нужно их переносить). Class Logic является бизнес-логикой и принесет много пользы от Scala интересных функций.
Мне нужно переписать класс Logic в Scala, сохраняя целостность с классами Main и Dao. Лучшая переписка будет выглядеть (не работает):
class Logic2 {
  def calculate(ints: List[Integer]) : List[Integer] = {
      val together: List[Integer] = new Dao().getSomeInts()
      together ++ ints
  }
}
Идеальное поведение: списки внутри Logic2 являются родными Scala списками. Все входы/выходы java.util.Lists автоматически загружаются в коробку/распаковываются. Но это не работает.
Вместо этого это работает (спасибо scala-javautils (GitHub)):
import org.scala_tools.javautils.Implicits._
class Logic3 {
  def calculate(ints: java.util.List[Integer]) : java.util.List[Integer] = {
      val together: List[Integer] = new Dao().getSomeInts().toScala
      (together ++ ints.toScala).toJava
  }
}
Но это выглядит уродливо.
Как добиться прозрачного магического преобразования списков и карт между Java ↔ Scala (без необходимости делать toScala/toJava)?
Если это невозможно, каковы наилучшие методы переноса кода Java → Scala, который использует java.util.List и друзей?
