如何为我的Scala代码提供Java友好的接口?
我用Scala编写了一个库。现在,一些Java程序员想要使用它。因为他们不熟悉Scala集合,比如如何为我的Scala代码提供Java友好的接口?,java,scala,interop,standard-library,Java,Scala,Interop,Standard Library,我用Scala编写了一个库。现在,一些Java程序员想要使用它。因为他们不熟悉Scala集合,比如Seq或ArrayBuffer,所以他们使用它会感到不舒服。我需要对我的代码做一些更改 让我把我的实际问题简化为一个简单的类: class Person(val name: String, val age: Int, val friends: Set[Person]) { def friendNamesAndAges: ArrayBuffer[(String, Int)] = frien
Seq
或ArrayBuffer
,所以他们使用它会感到不舒服。我需要对我的代码做一些更改
让我把我的实际问题简化为一个简单的类:
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用户与人
对象交互时,我该如何让他们感到舒适?理想情况下,他们的代码应该是
import java.util.HashSet;
import java.util.ArrayList;
...
Person somePerson = // some person
HashSet<Person> a = somePerson.friends();
ArrayList<Pair<String, Int>> b = somePerson.friendNamesAndAges();
import java.util.HashSet;
导入java.util.ArrayList;
...
Person somePerson=//某人
HashSet a=somePerson.friends();
ArrayList 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();
导入scala.*;
导入scala.collection.immutable.Set;
导入scala.collection.mutable.ArrayBuffer;
...
Person somePerson=//某人
Set a=somePerson.friends();
ArrayBuffer b=somePerson.friendNamesAndAges();
Java程序员可能会觉得不舒服
我知道的一种方法是
导入scala.collection.JavaConverters.\uu
,并将.asJava
添加到集合中。但我最终将得到两个同名函数,返回一个Scala集合和一个Java集合。此外,JavaConverters.\u
没有像我在示例中那样的元组转换器 我想要这个Scala代码:
javaf(b: ArrayList[Pair[String, Int]) =
scalaf(b.map(p => (p.getLeft, p.getRight))
然后Java人会调用javaf
,而Scala人会调用scalaf
(在一个单独的地方)
这正是Play在Scala中编写代码并使用它提供Java友好API的方式。例如,请参见Scala类。不幸的是,它看起来像一项手动任务:在一个单独的包中设置与Java兼容的API,该包将封装Scala API。您的基础API越是“Scala惯用”,实际需要的适配器层就越多。。。