Java <-> Scala interop: transparent Liste et Carte de conversion

Je suis en train d'apprendre Scala et j'ai un projet en Java pour migrer à la Scala. Je veux migrer en réécrivant les classes une par une, et en vérifiant que la nouvelle classe ne rompt pas le projet.

Ce projet Java utilise beaucoup de java.util.List et java.util.Map. Dans les nouvelles classes Scala je voudrais utiliser Scala List et Map pour avoir bonne mine Scala code.

Le problème est que les nouvelles classes (ceux qui sont wtitten en Scala) de ne pas intégrer seamelessly avec Java code: Java besoins java.util.List, Scala a besoin de sa propre scala.List.

Voici un exemple simplifié du problème. Il y a des cours Principal, Logique, Dao. Ils s'appellent les uns les autres dans une ligne: Principal -> Logique -> 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);
    }
}

Dans ma situation, les classes Principal et Dao sont les classes du framework (je n'ai pas besoin de migrer). Classe Logique est la logique de gestion et profitera à beaucoup de Scala fonctionnalités intéressantes.

J'ai besoin de réécrire la classe Logique en Scala, tout en préservant l'intégrité des classes Principal et Dao. Le meilleur de réécriture ressemblerait (ne fonctionne pas):

class Logic2 {
  def calculate(ints: List[Integer]) : List[Integer] = {
      val together: List[Integer] = new Dao().getSomeInts()
      together ++ ints
  }
}

Idéal de comportement: les Listes à l'intérieur de Logic2 sont indigènes Scala Listes. Tous les sortir/java.util.Lists obtenir boxed/"unboxed" automagiquement. Mais cela ne fonctionne pas.

Au lieu de cela, ce n'travail (grâce à 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
  }
}

Mais il semble laid.

Comment puis-je obtenir transparent magie de conversion de Listes et Cartes entre Java <-> Scala (sans besoin de faire toScala/toJava)?

Si il n'est pas possible, quelles sont les meilleures pratiques en matière de migration Java -> Scala code qui utilise java.util.List et amis?

InformationsquelleAutor oshyshko | 2009-10-05