Функция лямбда Kotlin и несоответствие типов - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь перенести функцию с 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

Я что-то не так делаю?

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Если вы переключаете свой код на kotlin, без java взаимодействия, было бы лучше использовать лямбду, потому что это исключает использование всех стандартных шаблонов.

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)
  })

РЕДАКТИРОВАТЬ: Поскольку вы используете лямбду, вы можете повысить эффективность своего приложения, если используете встроенный модификатор

inline private fun <T> setOnTaskCompletedListener(task:Future<T>, listener: (T) -> Unit){
0 голосов
/ 04 марта 2020

В методе ниже вы упомянули listener: OnTaskCompletedListener<T> в качестве параметра объекта.

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)
  })

, преобразованный выше код, преобразовывая лямбду в анонимный класс, подобный этому

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)
      }
     })
0 голосов
/ 04 марта 2020

Это, вероятно, потому, что ваш setRecognizedText метод - void или Unit, и это последнее выражение в этом блоке (так вот, что будет возвращено - Unit - это Kotlin версия Void)

В Java коде вы возвращаете ноль - вы должны сделать то же самое, но подумайте об этом снова, потому что это похоже на запах кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...