簡體   English   中英

Lambdas 函數 Kotlin 和類型不匹配

[英]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方法是voidUnit並且它是這個塊中的最后一個表達式(所以這將返回 - UnitVoid 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM