【发布时间】:2009-10-05 12:40:34
【问题描述】:
我正在学习 Scala,并且我有一个要迁移到 Scala 的 Java 项目。我想通过一个接一个地重写类并检查新类没有破坏项目来迁移它。
这个 Java 项目使用了很多 java.util.List 和 java.util.Map。在新的 Scala 类中,我想使用 Scala 的 List 和 Map 来获得好看的 Scala 代码。
问题在于新类(在 Scala 中编写)不能与现有 Java 代码无缝集成:Java 需要 java.util.List,Scala 需要自己的 scala.List。
以下是问题的简化示例。有Main、Logic、Dao类。他们在一行中互相调用: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 是框架类(我不需要迁移它们)。 Logic 类是业务逻辑类,将受益于 Scala 的酷炫特性。
我需要在 Scala 中重写类 Logic,同时保持类 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之间Lists和Maps的透明魔法转换(无需toScala/toJava)?
如果不可能,迁移 Java -> 使用 java.util.List 和朋友的 Scala 代码的最佳做法是什么?
【问题讨论】:
标签: java scala interop scala-java-interop