当前位置: 首页 > 面试题库 >

无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用

高展
2023-03-14
问题内容

我有一个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中用作不具有本机功能支持的解决方法。

来自kotlin doc#sam-convershtml" target="_blank">ions:

请注意,SAM转换仅适用于接口,不适用于抽象类,即使它们也只有一个抽象方法。

另外,请注意,此功能仅适用于Java互操作。由于Kotlin具有适当的功能类型,因此不需要将功能自动转换为Kotlin接口的实现,因此不受支持。

然后应直接声明一个函数。

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

然后可以使用

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

在kotlin 1.4中,可以将SAM转换用于Kotlin类。

fun interface Listener {
    fun listen()
}

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

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


 类似资料:
  • 我知道有很多问题与类似的问题,但我一直在寻找答案,仍然无法找到我的问题。我已经尝试了几种方法来解决这个问题,但我找不到任何解决方案。。。 我代码的一部分:(我不会在其他任何地方使用这个函数) 我得到以下信息: 致命错误:无法在第20行的C:\wamp64\www\myProject-dev\Public\cajas\reposiciones\controller3.php:20中重新声明Valid

  • 5.1. 函数声明 函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。 func name(parameter-list) (result-list) { body } 形式参数列表描述了函数的参数名以及参数类型。这些参数作为局部变量,其值由参数调用者提供。返回值列表描述了函数返回值的变量名以及类型。如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。如

  • 我不明白发生了什么事。我严格遵循所有的微软文档,事实上甚至不使用任何我自己的脚本/代码。首先,我按照他们的文档创建Python函数。成功了。https://docs.microsoft.com/en-us/azure/azure-functions/create-first-function-cli-python?tabs=azure-cli、cmd、browser使用命令行工具将Azure功能连

  • 问题内容: 似乎有两种不同的方法可以在Golang中声明函数,如下所示: 以上作品。但是,以下方法不起作用: 它会抱怨: 那么和之间有什么区别? 我发现它的原因可能也是因为我也编写了许多Javascript。在Go中,似乎很少有人看到像这样的函数。在这两个中,我们可以说哪个比另一个更正确吗? 问题答案: 当你做 您正在为该变量分配匿名函数。您也可以这样写: 创建函数的另一种方法是创建一个命名函数:

  • 2.2. 函数声明 2.2.1. Python 和其他编程语言数据类型的比较 与其它大多数语言一样 Python 有函数, 但是它没有像 C++ 一样的独立的头文件;或者像 Pascal 一样的分离的 interface/implementation 段。 一旦需要函数时, 像下面这样声明即可: def buildConnectionString(params): 首先, 函数声明以关键字 de

  • 每个函数前面应该放置一段块注释,概要描述该函数做什么以及(如果不是很清晰)如何使用该函数。重要的设计决策讨论以及副作用说明也适合放在注释 中。避免提供那些代码本身可以清晰提供的信息。 函数的返回类型应该单独占据一行,(可选的)缩进一个级别。不用使用默认返回类型int;如果函数没有返回值,那么将返回类型声明为void。如 果返回值需要大段详细的说明,可以在函数之前的注释中描述;否则可以在同一行中对返