#kotlin
Вопрос:
Я только что наткнулся на класс данных следующим образом.
class A{
}
sealed class B
data class C(val isNext: Boolean = false, val builder: () -> A): A
class D: A{
}
Чтобы создать экземпляр класса, разработчик использовал следующее объявление.
C{D()}
Мое понимание лямбды заключается в том, () -> A
что это функция без имени, которая не принимает аргументов и создает экземпляр A, однако, учитывая, что вызывается конструктор A, могу ли я предположить, что это функция?
Комментарии:
1. Да, конструкторы-это такие же функции, как и любые другие. Внутренне они особенные, потому что они, ну, строят объекты, но для внешнего наблюдателя они работают так же, как и любая другая функция.
Ответ №1:
Конструктор-это тип функции, но вы не передаете его здесь как функцию, потому что вы завернули его, вызвав в лямбда-функции. Таким образом, вы передали функцию, которая внутренне вызывает конструктор.
Вы можете передать конструктор непосредственно в виде функции, например:
val c = C(::D)
Ответ №2:
Я привел в порядок твою обстановку:
open class A
class C(val isNext: Boolean = false, val builder: () -> A) : A()
class D : A()
С учетом этого все нижеперечисленное эквивалентно:
val bldr: () -> A = { D() }
C { D() }
// is the same as:
C(isNext = false, builder = { D() })
// is the same as:
C(isNext = false, builder = bldr)
Таким образом, лямбда-это просто переменная экземпляра с именем builder
C
точно так же, как isNext
есть. Если она будет вызвана, будет создан новый D
, который окажется подклассом A
Ответ №3:
() -> A
обозначает функцию, которая принимает нулевые документы и возвращает экземпляр A.
Экземпляр() неявно генерируется лямбдой, отсюда и выражение.