Можем ли мы передать java-метод в функцию kotlin типа () -> Unit?

У меня есть метод котлина, как показано ниже

 fun initDrawer(drawerView: DrawerView, drawerLayout: DrawerLayout, context: Context, onRefreshClick: ()  -> Unit) {
  }

Но когда я пытаюсь передать initDrawer (drawerView, drawerlayout, this, onRefreshClick ()) это дает мне ошибку required () не может быть применено к (kotlin.Unit)

можно ли передавать методы из java в kotlin.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
16
1
5 342
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Допустим, ваш метод Java находится в классе с именем Test:

public class Test {
    void onRefreshClick() {
        System.out.println("test");
    }
}

Это может быть вызвано вашей функцией Kotlin следующим образом (в качестве справки):

val t = Test()
initDrawer(drawerView, drawerlayout, this, t::onRefreshClick)

onRefreshClick также может быть статическим в Java, что позволит вам использовать его следующим образом:

initDrawer(drawerView, drawerlayout, this, Test::onRefreshClick)

Примечание: В Kotlin () -> Unit - это тип функции, которая не имеет аргументов и ничего не возвращает (это Unit, а не Nothing в качестве возвращаемого типа).

В Java нет Unit. Метод Java, соответствующий этому типу, не будет иметь аргументов и будет иметь тип возвращаемого значения void.

onRefreshClick () - это java-метод

avez raj 18.04.2018 13:09
Ответ принят как подходящий

Вы должны установить возвращаемое значение вашего onRefreshClick в Unit:

private Unit onRefreshClick() {
    //do something here
    return Unit.INSTANCE;
}

Тогда вы можете назвать это так:

initDrawer(drawerView, drawerLayout, this, this::onRefreshClick);

() -> Unit - это функция (лямбда), которая возвращает Unit. Модуль onRefreshClick () {} - это то, что вам нужно.

Dmitry 18.04.2018 13:17

Вы не можете передать свой Java-метод напрямую из Java, поскольку параметр Kotlin ожидает, что метод вернет Unit.

Вы можете следовать следующему шаблону:

kotlinClass.higherOrderFunction(() -> {functionToPass(); return Unit.INSTANCE;});

где functionToPass() определяется как:

private void functionToPass() {
    // do something
}

В твоем случае:

initDrawer(drawerView, drawerlayout, this, 
  () -> {onRefreshClick(); return Unit.INSTANCE;}) 

Другие вопросы по теме