4

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

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

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

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

4

3 回答 3

9

ScalaUnit就像 Java 的void原始语言,但并不完全相同。

Scala 的Unit类型和 Java 的Void类型完全不相关。Java 的Void类存在,因此您可以将其用作类似于原语的类型参数void,就像Integer存在作为原语的类似物一样int。在 Scala 中,Unit兼具Void和的作用void

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

长话短说,ScalaUnit和 JavaVoid是不同的野兽。由于您的 Java 库需要Void类型参数,因此您应该只给它。

于 2017-07-06T12:07:54.297 回答
4

根据我的经验, JavaVoid通常使用 withnull作为其唯一值,其中 asUnit也只有一个值:(). 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.*。否则,您将需要构造SingleResultCallbackusing的实例new

于 2017-07-06T12:35:05.633 回答
0

尝试javatoscala

它返回:

def insertOne(document: TDocument,
                callback: SingleResultCallback[Void]): Unit
于 2017-07-06T11:05:27.670 回答