Невозможно передать лямбду для интерфейса в вызове метода с Kotlin (например, как это делает setOnClickListener)

Я создал класс:

class SomeClass {
    var listener: SomeListener? = null

    interface SomeListener {
        fun onClick(v: View?)
    }

    fun addSomeListener(l: SomeListener){
        listener = l
    }

}

И я называю это следующим образом, который отлично работает:

SomeClass().addSomeListener(object : SomeClass.SomeListener {
            override fun onClick(v: View?) {
                // Do something
            }
        })

Однако следующий синтаксис не работает в Android Studio::

  SomeClass().addSomeListener{ view ->
                // Do something
        }

Несоответствие типов. Требуется: SomeClass.SomeListener Найдено: () → Единица измерения


Я этого не понимаю, потому что метод Android setOnClickListener реализован так же:

/**
     * Register a callback to be invoked when this view is clicked. If this view is not
     * clickable, it becomes clickable.
     *
     * @param l The callback that will run
     *
     * @see #setClickable(boolean)
     */
    public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }

и...

/**
     * Interface definition for a callback to be invoked when a view is clicked.
     */
    public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

это, очевидно, можно назвать как:

someView.setOnClickListener { view ->
// Do something
        }

Что мне не хватает?

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

Louis Wasserman 26.12.2020 19:09
2
1
290
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Звонит SAM Conversions. Если вы хотите, чтобы это работало, вам нужно добавить ключевое слово fun для вашего интерфейса, чтобы он выглядел так:

fun interface SomeListener {
        fun onClick(v: View?)
    }

Вы можете узнать больше об этом, прочитав этот принятый ответ.

Функциональные (SAM) интерфейсы: kotlinlang.org/docs/reference/fun-interfaces.html

ChristianB 26.12.2020 18:35

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