2017-06-26 3 views
0

次は、JavaからKotlinに書き換え方法である。しかしVert.x Kotlin種類の不一致は、ハンドラを必要と<AsyncResult <Unit>>が見つかり(ハンドラ<AsyncResult <Unit>>) - >ユニット

fun publishMessageSource(
     name: String, 
     address: String, 
     completionHandler: Handler<AsyncResult<Unit>> 
) { 
    val record = MessageSource.createRecord(name, address) 
    publish(record, completionHandler) 
} 

、私はそれを呼び出します

publishMessageSource("market-data", ADDRESS, { record: Handler<AsyncResult<Unit>> -> 
      if (!record.succeeded()) { 
       record.cause().printStackTrace() 
      } 
      println("Market-Data service published : ${record.succeeded()}") 
     }) 

私はエラーType Mismatch required Handler<AsyncResult<Unit>> found (Handler<AsyncResult<Unit>>) -> Unitを受け取ります。

私は間違っていますか?

答えて

3

ラムダはHandlerインターフェイスの1つの方法にかかるパラメータ(この場合はAsyncResult<Unit>)を使用する必要があります。あなたのラムダHandlerなので、Handlerをパラメータとしません。これは、代表ラムダとHandler<AsyncResult<Unit>>を作成

publishMessageSource("market-data", ADDRESS, Handler<AsyncResult<Unit>> { record: AsyncResult<Unit> -> 
    ... 
}) 

は、私はあなたの関数がKotlinで書かれているので、あなたも、それは次のようになり、ここではSAMのコンストラクタの明示的な呼び出しを必要とすると思いますその単一の方法。

publishMessageSource("market-data", ADDRESS, Handler<AsyncResult<Unit>> { record -> 
    ... 
}) 
+0

素晴らしい、感謝:

最後に、あなたはそれほど冗長であることをラムダの内部でタイプを省略することができます。 SAMコンストラクタに関する特に有用な情報それは私がラムダの 'record'の型を指定することで達成しようとしていたものです。私はSAM上のものを再読するつもりです。 – amb85

+0

ええ、これはちょっと変わったユースケースです。デフォルトでは、SAM変換は、ラムダを書き留めるだけでこれらのインタフェースをとるJavaインタフェースとJavaメソッドに対して機能しますが、関数がKotlinにあるときにラムダがこの場合でも使用できるようにする前にインタフェースの名前を明示的に記述します。これを考えると、関数を適切なKotlin関数にしてから、この内部を処理するためにHandlerを作成することができます。 – zsmb13

+0

良い提案:私はそれを考えなかった理由はあまり確かではありません。私は 'resultHandler:(AsyncResult ) - > Unit'に行き、' Handler >(resultHandler) 'として渡しました。最後のパラメータを大括弧表記の外側のラムダでも使用できるようにします。私はSAMコンストラクタを呼び出すときにそれを行うことができませんでした - その副作用の1つですか? – amb85

関連する問題