Intereting Posts
Необходимо получить абсолютный путь к веб-странице с помощью Java IntelliJ IDEA Не удалось найти org.jetbrains.kotlin: kotlin-gradle-plugins Кодирование запроса почтальона Локальная трансляция не обновляет пользовательский интерфейс android studio "ошибка: не удается найти или загрузить основной класс" в основном методе файла Kotlin Пустое второе место в Котлине Как вы пишете вторичные конструкторы для класса с параметрами типа? Вызвано: android.database.sqlite.SQLiteException: рядом с «org»: синтаксическая ошибка (код 1): при компиляции: Regex – слова соответствия, которые не являются строками Компиляция приложения Kotlin Android не удалась с сообщением: Неразрешенная ссылка: kotlinx как реализовать OnClickListener для пользовательского ViewHolder в моем просмотре recycler? Является ли частное свойство «полем»? Как я могу совместно использовать конфигурацию конфигурации между двумя файлами build.gradle.kts? Использовать группу в ConstraintLayout для прослушивания событий кликов на нескольких представлениях Как изменить глобальную переменную из реализации анонимного класса в котлин

Kotlin: Как дочерний класс может использовать функцию расширения родителя в вызове супер-конструктора?

Как дочерний класс может использовать функцию расширения родителя в поле лямбда?

Рассмотрим этот родительский класс:

abstract class Parent(val field: Int.() -> Any) { fun Int.print() = println(this) } 

И этот ребенок:

 class Child : Parent({ print() // DOESN'T COMPILE this.print() // DOESN'T COMPILE 5.print() // DOESN'T COMPILE val value = 5 value.print() // DOESN'T COMPILE }) 

Причина, по которой вы не можете использовать расширение Parent внутри аргумента вызова супер конструктора Child заключается в том, что его Parent часть еще не инициализирована в этой точке и поэтому не может использоваться в качестве диспетчерского получателя расширения.

Функции расширения члена могут использовать члены класса eclosing class, а это значит, что им нужен экземпляр класса для вызова, и вы не можете использовать экземпляр в его собственных аргументах конструктора.

В противном случае вы можете использовать расширения Parent любом месте Child элементов и в конструкторах (или блоках init ), потому что супер конструктор вызывается перед собственными конструкторами:

 class Child : Parent { constructor(): super({}) { 5.print() } fun f() { 5.print() } val g: (Int) -> Unit = { it.print() } } 

В вашем примере рассматриваемая лямбда не поле Parent (строго говоря), а параметр функции (конструктор класса).

Лямбда построена (разрешена) до того, как будет создан какой-либо объект, « Child или « Parent . Вот почему методы могут быть решены, и лямбда не входит в сферу Child .

PS

Название темы предполагает следующую ситуацию, но она компилирует все правильно:

 class Child : Parent({}) { val lambdaField: Int.() -> Any = { print() this.print() 5.print() } }