如何从Java调用Scala的Option构造函数

25

我正在处理一个混合Java/Scala项目,我试图从Java中调用一个Scala对象的方法。该方法以一个Option[Double]作为参数。我认为这样可以实现:

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

但是Eclipse告诉我:“Some(Double)的构造函数未定义”。

我应该以不同的方式调用scala.Some的构造函数吗?


1
在Java中,_方法_的类型参数可以被推断(有时),但是_构造函数_的类型参数永远不会被推断。 - Alexey Romanov
@Alexey 很高兴知道,我想那可能是我遇到麻烦的源头。即使我将Some<Double>参数化,我仍然遇到问题(请参考我对@user654801回答的评论)。 - pkaeding
2个回答

51
在Scala中,通常可以按以下方式将其提升为Option:
scala> val doubleValue = Option(1.0)
doubleValue: Option[Double] = Some(1.0)

()Option伴生对象的apply[A](A obj)方法的一种简化语法糖。因此,它可以直接在Java中调用:

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

这也帮助了我。Scala`def startServer(localBind: Option[Int] = None): Unit = { ... }`Java调用`Option so = Option.apply(9002);` `AcmeClient.startServer(so);` - drusolis

1

你可以用这种方式构造一个Some实例,这对我来说是可编译的。

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

问题可能是缺少泛型,请尝试进行以下操作,
scalaObj.scalaMethod(new Some<Double>(doubleValue));

嗯,当我尝试这样做时,我得到了“类型Some不是泛型;它不能用参数<Double>进行参数化”。这可能只是Eclipse/Scala集成的缺陷吗?我确实有import scala.Some;,所以我相信我正在使用正确的Some - pkaeding
6
这种方法的缺点是将null引用提升为Some(null),而不是None。更好的做法是使用Option伴生对象进行正确的提升。 - Vasil Remeniuk
@Vasil,谢谢,那很有道理。你(另一个)的回答解决了我的问题。 - pkaeding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接