2017-07-06 8 views
1

私はパラメータとしてVoidのクラスを必要とするJavaライブラリメソッドを持っています。例えば、com.mongodb.async.client.MongoCollectionスカラ単位のJava無効化

私はscalaからこのメソッドにアクセスしています。 Scalaは

がどのように私はこの方法にSingleResultCallback[Unit](代わりのSingleResultCallback[Void])を渡すことができます(私が間違っているなら、私にしてください修正)Voidの同等のようなタイプUnitを使用していますか?コンパイラはこれを許可していません。これを拾うべきではありませんか?

+0

最後の行が ''() '' noと等しい関数を与えます。 – alifirat

答えて

2

ScalaのUnitは、Javaのvoidプリミティブのようなものですが、それはまったく同じではありません。

ScalaのUnitタイプとJavaのVoidタイプは完全に無関係です。 JavaのVoidクラスが存在するので、Integerがプリミティブintのアナログとして存在するように、プリミティブvoidに類似したタイプパラメータとして使用できます。 Scalaでは、はVoidvoidの両方の役割を果たします。

UnitVoidの間の暗黙的な変換は、暗黙の変換がタイプではなくインスタンスで機能するため、存在しません。また、JavaのVoidタイプはインスタンスを持つことができません。 、

かいつまんでScalaのUnitとJavaのVoidは異なる獣です:(()。ScalaのUnitは、インスタンスを持っています)。 JavaライブラリーにはVoidタイプのパラメーターが必要なので、それを与えるだけです。 ()

0

それは返さjavatoscala

をお試しください:

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

申し訳ありませんが、これは私の質問に答えません。私はこのメソッドに 'SingleResultCallback [Void]'ではなく、callback = 'SingleResultCallback [Unit]'を渡したいと思います。それ、どうやったら出来るの? 'Void'から' Unit'への暗黙の変換はありません。 – Luciano

2

JavaのVoidは、私の経験から、通常Unitとしても、一つの値だけを持っている唯一の値としてnullで使用されています。 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を作成する必要があります。