2011-03-13 21 views
15

我正在處理一個混合的java/scala項目,並試圖從Java調用一個scala對象的方法。該方法以Option[Double]作爲參數。我認爲這將工作:如何從Java調用scala的選項構造函數

Double doubleValue = new Double(1.0); 
scalaObj.scalaMethod(new Some(doubleValue)); 

但Eclipse告訴我「構造函數一些(雙)是未定義的」。

我應該以不同的方式調用scala.Some的構造函數嗎?

+1

在Java中,_methods_類型參數可以推斷(有時),但類型參數_constructors_從來沒有。 – 2011-03-13 05:55:37

+0

@Alexey很高興知道,我認爲這可能是我的麻煩來源。儘管我參數化了'Some ',但我仍然遇到問題(請參閱我對@ user654801答案的評論)。 – pkaeding 2011-03-13 05:57:34

回答

35

Scala裏你通常舉起來選如下:

scala> val doubleValue = Option(1.0) 
doubleValue: Option[Double] = Some(1.0) 

()是一個語法糖apply[A](A obj)方法Option的同伴對象。因此,它可以直接調用Java中:

Option<Double> doubleValue = Option.apply(1.0); 
+2

賓果,就是這樣。謝謝! – pkaeding 2011-03-13 06:55:17

+0

這對我也有幫助。 斯卡拉 'DEF startserver的(localBind:選項[INT] =無):單位= {...}' Java調用 '選項這樣= Option.apply(9002);'' AcmeClient。 startserver的(左右);' – drusolis 2016-08-19 15:39:36

1

您可以構建一個有些實例的方式,這種編譯對我來說,

Some<Double> d = new Some<Double>(Double.valueOf(1)); 

該問題可能是缺少的仿製藥,嘗試做,

scalaObj.scalaMethod(new Some<Double>(doubleValue)); 
+0

嗯,當我嘗試我得到「類型一些不是通用的;它不能用參數參數化」。這可能僅僅是Eclipse/Scala集成中的一個缺陷嗎?我有'import scala.Some;'所以我相信我正在使用正確的'Some'。 – pkaeding 2011-03-13 05:54:53

+5

這種方法的缺點是將'null'引用提升爲'Some(null)',而不是'None'。您最好使用「Option」伴侶對象進行正確提升。 – 2011-03-13 06:50:33

+0

@Vasil,謝謝,這很有道理。您的(其他)答案解決了我的問題。 – pkaeding 2011-03-13 06:56:47