2012-09-10 31 views
7

我已經在Scala中編寫了一個API。有幾個入口點,我期待List [SomeTrait]作爲輸入並返回List [OtherTrait]。當Scala的List被調用時,使用java.util.List從Java調用Scala代碼

我在一個Java項目中使用Jar,並遇到了一個問題,試圖將java.util.List傳遞給期望Scala的List對象的方法。我意識到它們不一樣,Java不知道如何進行轉換。那麼,您如何在不期望Java調用者通過Scala列表的情況下完成這項工作?

回答

7

我很想聽聽其他建議,但這是我找到的解決方案,我在Google上找不到它。

如果我正常的Scala入門的一點是,是這樣的一種方法:

def doSomething(things: List[Thing]): List[Result] = { ... } 

我添加另一種方法是這樣的:

//import scala.collection.JavaConversions._ 
import scala.collection.JavaConverters._ 

def doSomething(things: java.util.List[Thing]): java.util.List[Result] = 
    doSomething(things.asScala.toList).asJava 

在調用原來的顯式轉換方法是因爲它最終會在一個無限循環中調用自己。

這是我第一次發佈和回答我自己的問題...如果我錯過了一些標準的方式來做到這一點,我表示歉意。這似乎是值得分享的,也值得開放討論更好的方法,因爲我對Scala非常陌生。

編輯更新代碼從@Luigi Plinge

+0

這正是答案我正要張貼 –

+4

你應該溝'JavaConversions'和使用'.asJava'結果重新轉換爲Java列表反映建議 –

+1

對Luigi的建議+1,不要使用JavaConversions,使用JavaConverters和明確的.asJava/.asScala方法 - 隱式轉換可以做很奇怪的事情。同時避免重載,創建一個shim/wrapper來從Java調用。 –