【发布时间】:2015-09-12 21:39:35
【问题描述】:
我用 Scala 编写了一个库。现在,一些 Java 程序员想要使用它。由于他们不熟悉 Seq 或 ArrayBuffer 等 Scala 集合,因此使用它时会感到不舒服。我需要对我的代码进行一些更改。
让我把我的实际问题简化为一个简单的类:
class Person(val name: String, val age: Int, val friends: Set[Person]) {
def friendNamesAndAges: ArrayBuffer[(String, Int)] =
friends.map(x => (x.name, x.age))[ArrayBuffer]
}
如何让我的 Java 用户在与 Person 对象交互时感到舒适?理想情况下,他们的代码应该是这样的
import java.util.HashSet;
import java.util.ArrayList;
...
Person somePerson = // some person
HashSet<Person> a = somePerson.friends();
ArrayList<Pair<String, Int>> b = somePerson.friendNamesAndAges();
然后他们就可以愉快地为所欲为,因为这些集合来自 Java 标准库。
我不想要的是:
import scala.*;
import scala.collection.immutable.Set;
import scala.collection.mutable.ArrayBuffer;
...
Person somePerson = // some person
Set<Person> a = somePerson.friends();
ArrayBuffer<Tuple2<String, Object>> b = somePerson.friendNamesAndAges();
Java 程序员可能会觉得不舒服。
我知道的一种方法是import scala.collection.JavaConverters._,然后将.asJava 添加到集合中。但我最终会得到两个同名的函数,返回一个 Scala 集合和一个 Java 集合。此外,JavaConverters._ 没有像我在示例中那样的元组转换器。
【问题讨论】:
-
不幸的是,这看起来像是一项手动任务:在一个单独的包中设置一个与 Java 兼容的 API,该包将包装您的 Scala API。你的基础 API 越是“Scala 惯用”,实际需要的适配器层就越多……
标签: java scala interop standard-library