gpt4 book ai didi

java - 无法为 Kotlin 声明的函数删除冗余 SAM 构造函数,但适用于 Java 声明的函数

转载 作者:IT老高 更新时间:2023-10-28 13:47:12 25 4
gpt4 key购买 nike

我有一个如下的 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?虽然它具有对函数的原生支持。

SAM 约定在 java8 中用作不支持 native 函数的解决方法。

来自 kotlin doc#sam-conversions :

Note that SAM conversions only work for interfaces, not for abstract classes, even if those also have just a single abstract method.

Also, note that this feature works only for Java interop; since Kotlin has proper function types, automatic conversion of functions into implementations of Kotlin interfaces is unnecessary and therefore unsupported.

你应该直接声明一个函数。

fun setPositiveButton(resId: Int, listener: (DialogInterface, Int) -> Unit) {
listener.invoke(
//DialogInterface, Int
)
}

然后就可以使用了

setPositiveButton(1, { _, _ -> doStuff() })

kotlin 1.4您可以对 Kotlin 类使用 SAM 转换。

fun interface Listener {
fun listen()
}

fun addListener(listener: Listener) = a.listen()

fun main() {
addListener {
println("Hello!")
}
}

关于java - 无法为 Kotlin 声明的函数删除冗余 SAM 构造函数,但适用于 Java 声明的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46051572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com