我有一个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
同时扮演Void
和void
的角色。
Unit
和Void
之间的隐式转换不可能存在,因为隐式转换适用于实例,而不是类型。此外,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