2011-03-13 73 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