【问题标题】:Scala API design for Java compatibilityScala API 设计以实现 Java 兼容性
【发布时间】:2016-03-31 00:56:30
【问题描述】:

假设我有以下 Scala API,我计划从 Scala 和 Java 调用它:

sealed abstract class InterpMethod
case object InterpLinear extends InterpMethod
case object InterpNearest extends InterpMethod
case object InterpSpline extends InterpMethod

class Interpolator {
  def interp(method: InterpMethod) = method match {
    case InterpLinear => { ... }
    case InterpNearest => { ... }
    case InterpSpline => { ... }
  }
}

object Interpolator { def apply() = new Interpolator }

// Scala Usage:
import myPackage._
Interpolator.interp(InterpNearest)

// Java Usage:
import myPackage.*
Interpolator myInterp = new Interpolator()
myInterp.interp(InterpNearest)

在 Scala 中运行良好。 Java抛出编译错误:InterpNearest cannot be resolved to a variable

有简单的解决方法吗?或者定义更Java友好的参数的更好方法?将参数定义为闭包会更好吗?

我们将不胜感激任何最佳做法或解决方法。这旨在成为更大的fluent interface 的一部分。我的关键标准是它需要在 Java 和 Scala 中都可用且干净。

【问题讨论】:

  • 也许给我们一个例子来说明你是如何在 Java 中使用它的?
  • 设计一个干净的 Java 接口,用 Scala 实现它,然后添加 Scala 风格的扩展

标签: java api scala


【解决方案1】:

http://lampwww.epfl.ch/~michelou/scala/using-scala-from-java.html 说你可以这样调用对象:

IterpNearest$.MODULE$

这不是很好。我想你应该接受@millimoose 的建议。

【讨论】:

  • 这个编译和工作,不是最干净的。也可以选择在抽象类 InterpMethod 中添加 def getInstance() = {this} 方法,但我不确定这是否更好。
  • 顺便说一下,看看你的代码,为什么不在Java中定义一个枚举然后在Scala中使用它(InterpMethod
  • @chriswynnyk 我认为getInstance() 更好,因为它不依赖于当前的名称修改方案(将来可能会改变)。
  • 如何在没有实例的情况下调用该方法?而要获得实例,您必须再次进行黑客攻击......
  • @gzm0 Scala 将为此生成静态转发器方法,因此在 Java 中您可以编写例如InterpNearest.getInstance()
猜你喜欢
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多