Рассмотрим следующий код Kotlin:
object Domain {
val name = "local"
val location = object {
val city = "Pittsburgh"
val state = "Pennsylvania"
}
}
Хотя это определение корректно и компилируется, следующая строка завершается ошибкой:
val x = Domain.location.city // Error:(30, 27) Kotlin: Unresolved reference: city
Однако, если мы перепишем приведенное выше определение следующим образом:
object City {
val city = "Pittsburgh"
val state = "Pennsylvania"
}
object Domain {
val name = "local"
val location = City
}
val x = Domain.location.city // works fine
Мой вопрос: действительно ли это правильное поведение в соответствии со спецификацией языка? Это не кажется разумным или последовательным. Это делает неудобным объявлять сложные одноэлементные объявления объектов, не разбивая каждый дочерний объект на объявление верхнего уровня. Кажется, что компилятор создает анонимные типы, когда используется этот синтаксис, однако тип присваиваемого значения всегда object
, когда определение находится во вложенном контексте. Это почти похоже на ошибку вывода типа в компиляторе. Что мне не хватает?
object Foo { val x; object Bar { val y } }
Однако, поскольку другой синтаксис существует и приводит к несколько бесполезному поведению, по-прежнему кажется, что он должен либо скомпилироваться в эквивалентный код, либо быть запрещенным. . - person LBushkin   schedule 23.08.2019