WedX - журнал о программировании и компьютерных науках

Kotlin - интерфейсы как замыкающие лямбды

Какие правила позволяют использовать интерфейс в качестве аргумента замыкающего лямбда?

Я думал, что единственное правило заключалось в том, чтобы у него была уникальная функция в своем определении, однако я столкнулся со следующей проблемой:

У меня был этот интерфейс Java

public interface ToolbarFragmentCallBack {
    void onNavigationClick();
}

Вызывается из класса java:

public void addToolBar(int container, String title, boolean isParent,
                       ToolbarFragment.ToolbarFragmentCallBack callback) {
      //do something
}

Это было вызвано как из файлов Kotlin, так и из файлов Java:

Котлин (1):

addToolBar(R.id.toolbar_fragment, toolbarTitle, toolbarParent) {
            presenter.onClickNavigationToolBar()
}

Java (2):

addToolBar(R.id.toolbar_fragment, definition.getTitle(), false, () -> {
            activity.onBackPressed();
        });

Однако недавно я перенес интерфейс на Kotlin:

interface ToolbarFragmentCallBack {
    fun onNavigationClick()
}

И теперь вызовы реализации ** Kotlin (1) ** не компилируются с сообщением

Несоответствие типов: предполагаемый тип () -> Unit, но ToolbarFragment.ToolbarFragmentCallBack! ожидалось


  • О, спасибо, @jsamol, я не знал, что это только для интерфейсов Java. Вы хотите опубликовать это в качестве ответа, чтобы я мог выбрать его как таковой? 30.12.2019

Ответы:


1

Редактировать:

Теперь это возможно с Kotlin 1.4.

Однако обратите внимание, что преобразования SAM по-прежнему не будут работать со стандартными интерфейсами, вы должны явно объявить свой интерфейс как функциональный интерфейс:

fun interface ToolbarFragmentCallBack {
    fun onNavigationClick()
}

addToolBar(R.id.toolbar_fragment, toolbarTitle, toolbarParent) {
    presenter.onClickNavigationToolBar()
}

Старый ответ:

На данный момент Kotlin поддерживает преобразования SAM только для интерфейсов Java (см. документы):

Также обратите внимание, что эта функция работает только для взаимодействия с Java; поскольку Kotlin имеет правильные типы функций, автоматическое преобразование функций в реализации интерфейсов Kotlin не требуется и, следовательно, не поддерживается.

Однако это скоро изменится в новой версии 1.4 (см. Чего ожидать в Kotlin 1.4):

Сообщество попросило нас предоставить поддержку преобразования SAM для классов Kotlin. [...] В настоящее время преобразования SAM работают только для интерфейсов Java и абстрактных классов. Первоначальная идея, лежащая в основе этого дизайна, заключалась в том, чтобы явно использовать типы функций для таких случаев использования. Однако оказалось, что типы функций и типы не охватывают все сценарии использования, и людям часто приходилось сохранять интерфейс на Java только для того, чтобы получить для него SAM-преобразование.

30.12.2019
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]