2017-06-26 65 views
0

以下是從Java在科特林重寫的方法:Vert.x科特林類型不匹配所需處理程序<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

您的lambda應採用Handler接口的單一方法所採用的參數,即在此情況下爲AsyncResult<Unit>。您的lambda Handler,所以它不會將Handler作爲參數。

我想你也需要將SAM構造函數的顯式調用這裏,因爲你的函數寫在科特林,這將是這個樣子:

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

這與代表一個lambda創建Handler<AsyncResult<Unit>>其單一方法。

最後,你可以省略拉姆達裏面的類型要少冗餘:

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

真棒,謝謝。有關SAM構造函數的特別有用的信息。這正是我想通過在lambda中指定'record'類型來實現的。我將重新閱讀SAM上的內容。 – amb85

+0

是的,這是一個奇怪的用例。默認情況下,SAM轉換適用於Java接口和Java方法,這些接口只需寫下一個lambda即可使用這些接口,但在該函數位於Kotlin時,在lambda使其可用之前明確寫入接口名稱。現在我想起來了,你可以讓你的函數獲得一個合適的Kotlin函數,然後在其中創建Handler來使這個更加整潔。 – zsmb13

+0

好建議:不太確定爲什麼我沒有想到這一點。我已經去了'resultHandler:(AsyncResult ) - > Unit'並把它作爲'Handler >(resultHandler)'傳遞。允許我使用最後一個參數,也是括號內的lambda表達式。我在調用SAM構造函數時無法這麼做 - 是它的一個副作用? – amb85

相關問題