Java Void to Scala Unit



我有一个java库方法,需要一个Void类作为参数。 例如,在com.mongodb.async.client.MongoCollection

void insertOne(TDocument document, SingleResultCallback<Void> callback);

我正在从 scala 访问此方法。Scala 使用类型Unit作为等价物Void(如果我错了,请纠正我)

如何将SingleResultCallback[Unit](而不是SingleResultCallback[Void])传递给此方法?编译器不允许这样做。不应该是捡到这个吗?

>Scala的Unit就像Java的void原语,但它不完全是一回事。

Scala的Unit类型和Java的Void类型是完全不相关的。Java的Void类存在,因此您可以将其用作类似于原始void的类型参数,就像Integer作为原始int的类似物存在一样。在 Scala 中,Unit同时扮演Voidvoid的角色。

UnitVoid之间的隐式转换不可能存在,因为隐式转换适用于实例,而不是类型。此外,Java 的Void类型不能有实例。(Scala的Unit确实有一个实例:()

长话短说,Scala的Unit和Java的Void是不同的野兽。由于您的 Java 库需要Void类型参数,因此您应该只提供该参数。

Java的Void是根据我的经验,通常使用null作为其唯一值,其中Unit也只有一个值:()。 SingleResultCallback 只是 SAM 类型的(T, Throwable) => Unit。这意味着如果需要,我们可以将它们从Unit转换为:

def toUnit(cb: SingleResultCallback[Void]): SingleResultCallback[Unit] =
(u, throwable) => cb(null, throwable)
def fromUnit(cb: SingleResultCallback[Unit]): SingleResultCallback[Void] =
(v, throwable) => cb((), throwable)

这是假设你使用Scala 2.12.*。否则,您将需要使用new构造SingleResultCallback实例。

试试javatoscala

它返回:

def insertOne(document: TDocument,
callback: SingleResultCallback[Void]): Unit

相关内容

  • 没有找到相关文章

最新更新