对于Kotlin声明的函数,冗余的SAM构造函数不能被移除,而是在Java声明的函数上工作
我有一个Java类的功能如下
public void setPositiveButton(int resId, DialogInterface.OnClickListener listener)
我也有相同的Kotlin Class功能,如下所示
fun setPositiveButton(resId: Int, listener: DialogInterface.OnClickListener)
当我从Kotlin代码打电话给他们时
javaClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()}) kotlinClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()})
可以减少Java类函数调用,但不能减少Kotlin类函数
javaClassObj.setPositiveButton(R.string.some_string, { _, _ -> someFunc()}) kotlinClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()})
为什么Kotlin函数调用不能按照为Java启用的方式减少冗余SAM-Constructor?
你为什么要在kotlin中使用SAM? 同时它具有对功能的本地支持。
在java8中使用SAM约定作为没有本地功能支持的工作。
来自kotlin doc#sam-conversions :
请注意,SAM转换仅适用于接口,不适用于抽象类,即使这些也只有一个抽象方法。
此外,请注意,此功能仅适用于Java interop; 由于Kotlin具有适当的函数类型,函数自动转换为Kotlin接口的实现是不必要的,因此不受支持。
你应该直接声明一个函数。
fun setPositiveButton(resId: Int, listener: (DialogInterface, Int) -> Unit) { listener.invoke( //DialogInterface, Int ) }
然后才能使用
setPositiveButton(1, { _, _ -> doStuff() })