我有一个Java Class函数,如下所示
public void setPositiveButton(int resId, DialogInterface.OnClickListener listener)
我也有与下面相同的Kotlin类功能
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?
答案 0 :(得分:9)
为什么要在kotlin中使用SAM?虽然它本身就支持功能。
SAM约定在java8中用作没有本机函数支持的工作。
请注意,SAM转换仅适用于接口,不适用于抽象 类,即使那些也只有一个抽象方法。
另请注意,此功能仅适用于Java互操作;自从Kotlin 具有适当的功能类型,功能自动转换为 因此,Kotlin接口的实现是不必要的 不支持的。
然后你应该直接声明一个函数。
fun setPositiveButton(resId: Int, listener: (DialogInterface, Int) -> Unit) {
listener.invoke(
//DialogInterface, Int
)
}
然后可以使用
setPositiveButton(1, { _, _ -> doStuff() })
答案 1 :(得分:2)
扩展@humazed答案,因为编译器抱怨
lambda参数应移出括号
setPositiveButton("ok"){_,_ -> doSomething()}