Зависит от настроек компилятора.
Если передавать компилятору разные флаги, то байт-код для лямбды получается разный.
Вообще проще всего декомпилировать и посмотреть. Ярослав прав, там бывают разные случаи. Инлайн лямбды вообще ни во что превращаются.
А вам зачем? Просто если ради интереса - это одно, а если вы попытаетесь на это завязаться при работе с ними, то не советую, так как это нарушение абстракции.
Есть же наследование от лямбд, для чего это вообще?
В смысле наследование от лямбд? Лямбда или анонимная функция - объект. В Котлин нет прототипного наследования, поэтому не понимаю, какое такое наследование от лямбд?
class A: () -> Unit{}
Это класс, реализующий функциональный тип () -> Unit
Я понимаю, но разве это не будет нарушением абстракций?
Нет. Функциональный тип () -> Unit - тип любой функции (лямбды, анонимки, ссылки на функцию), которая не принимает параметров и возвращает Unit
А можете привести пример, где лучше использовать этот вариант, чем переопределение оператора invoke?
Ну если у вас есть API, ожидающее объект типа () -> Unit, то простое переопределение invoke не даст вам возможность передать объект вашего класса в качестве аргумента типа () -> Unit
То есть только для различных видов коллбэков?
Ну для использования в качестве аргументов ФВП. Это несколько более общее, чем коллбэки. Например, мне как-то сложно концепцию коллбэков прицепить к тем же композициям функций: inline fun <T, R1, R2> ((T) -> R1).andThen(crossinline after: (R1) -> R2): (T) -> R2 = { after(this(it)) }
Обсуждают сегодня