Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为我的Scala代码提供Java友好的接口?_Java_Scala_Interop_Standard Library - Fatal编程技术网

如何为我的Scala代码提供Java友好的接口?

如何为我的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

我用Scala编写了一个库。现在,一些Java程序员想要使用它。因为他们不熟悉Scala集合,比如
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惯用”,实际需要的适配器层就越多。。。