2013-05-02 46 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