Java Void 到 Scala 单位
Java Void to Scala Unit
我有一个 java 库方法需要 Void
的 class 作为参数。例如,在 com.mongodb.async.client.MongoCollection
:
void insertOne(TDocument document, SingleResultCallback<Void> callback);
我正在从 scala 访问这个方法。 Scala 使用类型 Unit
相当于 Void
(如果我错了请纠正我)
如何将 SingleResultCallback[Unit]
(而不是 SingleResultCallback[Void]
)传递给此方法?编译器不允许这样做。它不应该捡起这个吗?
它返回:
def insertOne(document: TDocument,
callback: SingleResultCallback[Void]): Unit
Scala 的 Unit
类似于 Java 的 void
原语,但并不完全相同。
Scala 的 Unit
类型和 Java 的 Void
类型完全无关。 Java 的 Void
class 存在,因此您可以将其用作类似于原始 void
的类型参数,就像 Integer
作为原始 [ 的模拟存在一样=17=]。在 Scala 中,Unit
完成了 Void
和 void
的角色。
Unit
和 Void
之间的隐式转换不存在,因为隐式转换适用于实例,而不适用于类型。此外,Java 的 Void
类型不能有实例。 (Scala 的 Unit
确实有一个实例:()
。)
长话短说,Scala 的 Unit
和 Java 的 Void
是不同的野兽。由于您的 Java 库需要 Void
类型参数,您应该直接给它。
Java 的 Void
根据我的经验,通常使用 null
作为其唯一值,而 Unit
也只有一个值:()
.
SingleResultCallback 只是 (T, Throwable) => Unit
的 SAM 类型。这意味着如果需要,我们可以将它们从 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
的实例
我有一个 java 库方法需要 Void
的 class 作为参数。例如,在 com.mongodb.async.client.MongoCollection
:
void insertOne(TDocument document, SingleResultCallback<Void> callback);
我正在从 scala 访问这个方法。 Scala 使用类型 Unit
相当于 Void
(如果我错了请纠正我)
如何将 SingleResultCallback[Unit]
(而不是 SingleResultCallback[Void]
)传递给此方法?编译器不允许这样做。它不应该捡起这个吗?
它返回:
def insertOne(document: TDocument,
callback: SingleResultCallback[Void]): Unit
Scala 的 Unit
类似于 Java 的 void
原语,但并不完全相同。
Scala 的 Unit
类型和 Java 的 Void
类型完全无关。 Java 的 Void
class 存在,因此您可以将其用作类似于原始 void
的类型参数,就像 Integer
作为原始 [ 的模拟存在一样=17=]。在 Scala 中,Unit
完成了 Void
和 void
的角色。
Unit
和 Void
之间的隐式转换不存在,因为隐式转换适用于实例,而不适用于类型。此外,Java 的 Void
类型不能有实例。 (Scala 的 Unit
确实有一个实例:()
。)
长话短说,Scala 的 Unit
和 Java 的 Void
是不同的野兽。由于您的 Java 库需要 Void
类型参数,您应该直接给它。
Java 的 Void
根据我的经验,通常使用 null
作为其唯一值,而 Unit
也只有一个值:()
.
SingleResultCallback 只是 (T, Throwable) => Unit
的 SAM 类型。这意味着如果需要,我们可以将它们从 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
的实例