我將我的項目遷移到 Kotlin,這個階段 Java 和 Kotlin 之間有很多交互。在下面的示例中,我需要傳遞一個實現 Java Supply 接口的函數。java.util.concurrent.CompletableFuture.supplyAsync<Int>({ -> 3 }, executor)CompletableFuture.supplyAsync({ 3 }, executor)IntelJ 顯示錯誤:Type mismatch.Required: Supplier<Int!>!Found: () -> Int我找到了一個使用幫助程序類的解決方法,但它不是內聯解決方案。class Help : Supplier<Int> { fun get() = 3 }supplyAsync(Help(), executor)
1 回答

PIPIONE
TA貢獻1829條經驗 獲得超9個贊
這將起作用:
CompletableFuture.supplyAsync({?3?},?executor::execute)
注意這兩個簽名是
public?static?<U>?supplyAsync(supplier:?Supplier<U>,?executor:?Executor):?CompletableFuture<U> public?static?<U>?supplyAsync(supplier:?()?->?U,?executor:?(Runnable)?->?Unit):?CompletableFuture<U>
也就是說,如果您想傳入 lambda,執行它的對象必須是方法引用(而不是實例Executor
)。
Kotlin 允許您調用采用 SAM(功能接口)參數并以適當的 Kotlin 函數作為參數的方法。然而,這要么全有,要么全無。您可以為所有 SAM 參數傳遞一個 Kotlin 函數,也可以不傳遞一個 Kotlin 函數。這解釋了為什么您最初采用的方法無法編譯。這不是 Java API 的特定方法,而是適用于 Java 類上定義的所有方法。
添加回答
舉報
0/150
提交
取消