Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法在带有Kotlin的方法调用中为接口传递lambda(就像setOnClickListener那样)_Android_Kotlin_Lambda - Fatal编程技术网

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

Android 无法在带有Kotlin的方法调用中为接口传递lambda(就像setOnClickListener那样),android,kotlin,lambda,Android,Kotlin,Lambda,我创建了这个类: class SomeClass { var listener: SomeListener? = null interface SomeListener { fun onClick(v: View?) } fun addSomeListener(l: SomeListener){ listener = l } } 我这样称呼它,效果很好: SomeClass().addSomeListener(obj

我创建了这个类:

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
        }

我缺少什么?

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

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

通过阅读本文,您可以了解更多信息。

功能(SAM)接口:您不知道Java接口与Kotlin接口的处理方式不同。