2013-05-02 19 views
1

假设我有以下Scala的API,这是我打算从Scala和Java调用:斯卡拉API设计的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) 

在斯卡拉的伟大工程。 Java抛出编译错误:InterpNearest cannot be resolved to a variable

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

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

+0

也许给我们一个如何在Java中使用它的例子? – mepcotterell 2013-05-02 13:56:22

+3

设计一个干净的Java接口,用Scala实现它,然后添加Scala风格的扩展 – millimoose 2013-05-02 14:06:25

回答

0

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

IterpNearest$.MODULE$ 

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

+0

这是编译和工作的,而不是最干净的。还有向抽象类InterpMethod添加一个'def getInstance()= {this}'方法的选项,但我不确定这是否更好。 – chriswynnyk 2013-05-02 15:25:22

+0

顺便说一句,看你的代码,为什么不定义一个Java中的Enum,然后在Scala中使用它(对于'InterpMethod') – gzm0 2013-05-02 15:45:09

+0

@chriswynnyk我认为'getInstance()'更好,因为它不依赖于当前的名称修改方案(将来可能会改变)。 – paradigmatic 2013-05-02 16:26:54