[英]Lambdas function Kotlin and type Mismatch
我正在嘗試將一個函數從 java 移植到 kotlin,但我遇到了很多問題。 原來的java代碼是這樣的:
setOnTaskCompletedListener(task, result -> {
final String s = result.getText();
reco.close();
Log.i(logTag, "Recognizer returned: " + s);
setRecognizedText(s);
});
private <T> void setOnTaskCompletedListener(Future<T> task, OnTaskCompletedListener<T> listener) {
s_executorService.submit(() -> {
T result = task.get();
listener.onCompleted(result);
return null;
});
}
這是我的 kotlin 轉換代碼:
private fun <T> setOnTaskCompletedListener(task:Future<T>, listener: OnTaskCompletedListener<T>){
s_executorService.submit({
val result = task.get()
listener.onCompleted(result)
});
}
這是我的代碼返回錯誤的地方:
setOnTaskCompletedListener(task, { result ->
val s = result.getText()
reco.close()
Log.i(logTag, "Recognizer returned: " + s)
setRecognizedText(s)
})
我通過“{ result -> ... }”不斷收到此錯誤:
Type mismatch: inferred type is (???) -> Unit but OnTaskCompletedListener<???> was expected
難道我做錯了什么?
這可能是因為你的setRecognizedText
方法是void
或Unit
並且它是這個塊中的最后一個表達式(所以這將返回 - Unit
是Void
Kotlin 版本)
在 Java 代碼中,您將返回 null - 您應該這樣做,但請考慮再次考慮這一點,因為它看起來像代碼異味
如果您將代碼轉換為 kotlin,如果沒有 java 互操作,最好使用 lambda,因為它刪除了所有樣板接口的使用。
private fun <T> setOnTaskCompletedListener(task:Future<T>, listener: (T) -> Unit){
s_executorService.submit({
val result = task.get()
listener(result)
});
}
//call
setOnTaskCompletedListener(task, { result ->
val s = result.getText()
reco.close()
Log.i(logTag, "Recognizer returned: " + s)
setRecognizedText(s)
})
編輯:由於使用 lambda,如果您使用內聯修飾符,您可以提高應用程序的效率
inline private fun <T> setOnTaskCompletedListener(task:Future<T>, listener: (T) -> Unit){
在下面的方法中,您提到了listener: OnTaskCompletedListener<T>
作為對象參數。
private fun <T> setOnTaskCompletedListener(task:Future<T>, listener: OnTaskCompletedListener<T>){
s_executorService.submit({
val result = task.get()
listener.onCompleted(result)
});
}
但是在實際調用它時,您正在傳遞一個 lambda 參數
setOnTaskCompletedListener(task, { result ->
val s = result.getText()
reco.close()
Log.i(logTag, "Recognizer returned: " + s)
setRecognizedText(s)
})
通過將 lambda 轉換為這樣的匿名類來轉換上述代碼
setOnTaskCompletedListener(task,object:OnTaskCompletedListener< /*your T type*/>{
override fun yourInterfaceMethod(result:ResultType) {
val s = result.getText()
reco.close()
Log.i(logTag, "Recognizer returned: " + s)
setRecognizedText(s)
}
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.