【问题标题】:How to provide a Java-friendly interface for my Scala code?如何为我的 Scala 代码提供 Java 友好的界面?
【发布时间】:2015-09-12 21:39:35
【问题描述】:

我用 Scala 编写了一个库。现在,一些 Java 程序员想要使用它。由于他们不熟悉 SeqArrayBuffer 等 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


【解决方案1】:

我有这个 Scala 代码:

javaf(b: ArrayList[Pair[String, Int]) =
  scalaf(b.map(p => (p.getLeft, p.getRight))

然后 Java 人会调用 javaf 而 Scala 人会调用 scalaf(在一个单独的地方)。

这正是 Play 在 Scala 中编写一些代码并使用它提供 Java 友好 API 的方式。例如,参见JavaResults Scala 类。

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多