Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果抽象类在Kotlin中有多个方法,我可以使用lambda吗?_Android_Kotlin - Fatal编程技术网

Android 如果抽象类在Kotlin中有多个方法,我可以使用lambda吗?

Android 如果抽象类在Kotlin中有多个方法,我可以使用lambda吗?,android,kotlin,Android,Kotlin,例如,如果我认为这段代码编译器建议更改为 private val viewListener = object : View.OnClickListener { override fun onClick(v: View) { toast("View clicked!$v") } } 以下代码 private val viewListener = View.OnClickListener { v -> toast("View clicked!$v")

例如,如果我认为这段代码编译器建议更改为

private val viewListener = object : View.OnClickListener {
    override fun onClick(v: View) {
        toast("View clicked!$v")
    }
}
以下代码

private val viewListener = View.OnClickListener { v ->
    toast("View clicked!$v")
}
但是如果我有这个抽象类

public abstract class DrawableCallback implements Callback {

    public void onLoaded() {}

    public void onError() {}

    public static int extractDrawable() {}

    public abstract void onDrawableExtracted(int color);
}
我在这里用它

private val drawableCallback = object : DrawableCallback() {
    override fun onDrawableExtracted(color: Int) {
      //...
    }
}

在这里,我似乎无法转换为lambda,您能解释一下原因吗?

不能将其用于抽象类。参考Kotlin Lang(也在Michael的评论中)。它明确指出:

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


。如果您需要了解更多信息(如“为什么不?”),请参阅本讨论。这个讨论是围绕Java展开的,但由于明显的原因,同样适用于JVM上的Kotlin。

您不能将它用于抽象类。参考Kotlin Lang(也在Michael的评论中)。它明确指出:

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


。如果您需要了解更多信息(如“为什么不?”),请参阅本讨论。这个讨论是围绕Java展开的,但同样适用于JVM上的Kotlin,原因很明显。

请参见@Michael,因此它不适用于抽象类,是吗?顺便说一句,您的抽象类也可以是除一个方法之外的所有方法的默认实现的接口,然后它就可以工作了。看@Michael,所以它对抽象类不起作用,是吗?顺便说一句,你的抽象类可能是一个接口,除了一个方法之外,所有方法都有默认实现,然后它就可以工作了。我知道它只对具有1个方法的接口起作用,但如果接口>1个方法,有办法让它工作,是的,如果Java类有多个采用函数接口的方法,则可以通过使用将lambda转换为特定SAM类型的适配器函数来选择需要调用的方法。这些适配器函数在需要时也由编译器生成,但我不知道如何才能做到这一点?我知道它只适用于具有1个方法的接口,但如果接口>1个方法,则有办法使其工作,如果Java类具有多个取用函数接口的方法,通过使用将lambda转换为特定SAM类型的适配器函数,可以选择需要调用的类型。这些适配器函数在需要时也由编译器生成,但我不知道如何才能做到这一点?