无法在使用 Kotlin 的方法调用中为接口传递 lambda(就像 setOnClickListener 那样)

Cro*_*ile 2 lambda android kotlin

我创建了这个类:

class SomeClass {
    var listener: SomeListener? = null

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

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

}
Run Code Online (Sandbox Code Playgroud)

我按如下方式调用它,效果很好:

SomeClass().addSomeListener(object : SomeClass.SomeListener {
            override fun onClick(v: View?) {
                // Do something
            }
        })
Run Code Online (Sandbox Code Playgroud)

但是,以下语法在 Android Studio 中失败

  SomeClass().addSomeListener{ view ->
                // Do something
        }
Run Code Online (Sandbox Code Playgroud)

类型不匹配。必需: 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;
    }
Run Code Online (Sandbox Code Playgroud)

和...

/**
     * 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);
    }
Run Code Online (Sandbox Code Playgroud)

这显然可以称为:

someView.setOnClickListener { view ->
// Do something
        }
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

i30*_*mb1 8

它在叫SAM Conversions。如果你想让它工作,你需要fun为你的界面添加关键字,所以它看起来像这样:

fun interface SomeListener {
        fun onClick(v: View?)
    }
Run Code Online (Sandbox Code Playgroud)

您可以通过阅读这个已接受的答案来了解更多信息。