Могу ли я использовать лямбду, если абстрактный класс имеет более 1 метода в Kotlin? - PullRequest
0 голосов
/ 26 апреля 2020

Например, если мне этот кодовый компилятор предлагает изменить на

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) {
      //...
    }
}

Здесь, кажется, я не могу перейти в лямбду, вы можете объяснить, почему?

1 Ответ

2 голосов
/ 27 апреля 2020

Вы не можете использовать его с абстрактными классами . См. Kotlin Lang документация (также в комментариях Майкла). В нем четко сказано:

Обратите внимание, что преобразования SAM работают только для интерфейсов, но не для абстрактных классов, даже если они также имеют только один абстрактный метод.

. Если вам нужно узнать больше (например, почему нет?), Обратитесь к этому обсуждению Почему нельзя @FunctionalInterface применить к абстрактному базовому классу SAM . Это обсуждение около Java, но в равной степени относится к Kotlin в JVM по очевидным причинам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...