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])传递给此方法?编译器不允许这样做。它不应该捡起这个吗?

尝试javatoscala

它返回:

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

Scala 的 Unit 类似于 Java 的 void 原语,但并不完全相同。

Scala 的 Unit 类型和 Java 的 Void 类型完全无关。 Java 的 Void class 存在,因此您可以将其用作类似于原始 void 的类型参数,就像 Integer 作为原始 [ 的模拟存在一样=17=]。在 Scala 中,Unit 完成了 Voidvoid 的角色。

UnitVoid 之间的隐式转换不存在,因为隐式转换适用于实例,而不适用于类型。此外,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 的实例