对于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() })