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类型的适配器函数,可以选择需要调用的类型。这些适配器函数在需要时也由编译器生成,但我不知道如何才能做到这一点?