从Java中调用一个接受参数Option[Long]的Scala函数

3
我是一位能翻译文本的助手。

我有一个Scala函数,它接受类型为Option [Long]的单个参数。

我想从Java中调用此函数,但是如果我尝试这样做:

Long num = new Long(5);
scalaFunction(Option.apply(num));

我遇到了一个错误,它期望的是一个 Option<java.lang.Object>,而不接受我的 Option<java.lang.Long>。

如果我写成这样就可以编译和运行:

scalaFunction((Object) num);

然而,这种做法感觉有点不大妥当...那么...什么是正确的方法呢?

Scala中的Long类型与Java中的Long类型不同。 - twillouer
例如,Option.apply(scala.Long.unbox(5L))。 - twillouer
这仍然是一个Option<java.lang.Long>选项。我认为我正在尝试解决的问题是,为什么在Java中显示为想要Option<java.lang.Object>类型参数的函数在Scala中定义,如果这是有意的(由于类型擦除或其他原因),那么我应该如何解决它并正确地通过Java传递Option<Long>? - EstusFlask
我根本不明白。你想调用的函数需要 X<Object>,但你坚持它必须接受 X<Long>。这有多疯狂? - Ingo
是的,我也不知道那是否有意义。实际的信息是: ScalaClass中的scalaFunction(scala.Option<java.lang.Object>)无法应用于scalaFunction(scala.Option<java.lang.Long>)。 - EstusFlask
显示剩余3条评论
2个回答

2
我认为一个简单的 Option<scala.Long> a = Option.apply(scala.Long(5L)); 会起作用 :)

那对我仍然不起作用。我知道这将创建一个Option<scala.Long>,但从Java方面来看,我拥有的Scala函数也不接受它,它需要Option<java.lang.Object>。 - EstusFlask

1
我不确定,但我似乎之前遇到过这个问题,这是因为无法将Scala中的方差注释合理地转换为Java造成的。请注意,Option被定义为Option[+A]。如果我定义一个函数foo(x: Option [Long]),那么该函数将接受任何Option[A],其中A <: Long。然而,没有简单的方法来指示Option的协变性质给Java,所以我认为编译器只会将其呈现为普通的Option。

谢谢您的解释。您确认了我的想法。现在我想知道的是我该怎么做。将Java Long强制转换为Object并传递是否安全?这是一个坏主意吗?有更好的方法吗? - EstusFlask

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