对于Kotlin声明的函数,不能删除冗余SAM构造函数,但是对Java声明的函数起作用

时间:2017-09-05 09:29:59

标签: java kotlin

我有一个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?

2 个答案:

答案 0 :(得分:9)

为什么要在kotlin中使用SAM?虽然它本身就支持功能。

SAM约定在java8中用作没有本机函数支持的工作。

来自kotlin doc#sam-conversions

  

请注意,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()}