Рассмотрим следующий код:
object SomeObjectA { object SomeObjectB { val a = "test" } } val X = SomeObjectA typealias Y = SomeObjectA SomeObjectA.SomeObjectB // works X.SomeObjectB // error Y.SomeObjectB // error
Я не могу ссылаться на вложенный объект (во внешнем объекте), используя val
или typealias
которые относятся к внешнему объекту. Зачем?
То, что вы описали, происходит потому, что SomeObjectA
в вашем примере одновременно является именем объекта и именем его класса.
Поэтому для доступа к SomeObjectB
вам необходимо использовать синтаксис <classname>.<classname>
. Вот почему X.SomeObjectB
не компилируется ( <object>.<classname>
не поддерживается)
PS Это на самом деле не объясняет вашу вторую проблему с typealias
. Это похоже на ошибку, но я не уверен.
ошибка компилятора исходит от java, а object
kotlin s преобразуется в java- class
как показано ниже:
public final class SomeObjectA { private SomeObjectA() {/**/} public static final SomeObjectA INSTANCE = new SomeObjectA(); public static final class SomeObjectB { private SomeObjectB() {/**/} public static final SomeObjectB INSTANCE = new SomeObjectB(); } }
SomeObjectA.SomeObjectB
скомпилирован в java-код, как SomeObjectA.SomeObjectB
ниже:
SomeObjectA.SomeObjectB.INSTANCE;
SomeObjectA
скомпилирован в java-код, как SomeObjectA
ниже:
SomeObjectA.INSTANCE
мы знаем, что kotlin является базой для java, а java не разрешает доступ к вложенным классам через ссылку экземпляра, если вы сделаете компилятор, сообщите об ошибке: « Ошибка: java: требуется неожиданный тип: класс, пакет найден: переменная », для пример:
SomeObjectA a = SomeObjectA.INSTANCE; SomeObjectB b = a.SomeObjectB.INSTANCE;// error // ^--- compiler don't know where to go? package&class or variable?
код ниже, компилятор kotlin преобразует ошибку компилятора java как: « Ошибка: Kotlin: Вложенный объект« SomeObjectB »доступен через ссылку экземпляра ».
val a = SomeObjectA; val b = a.SomeObjectB; // ^--- Error
Алиасы типа не вводят новые типы. Они эквивалентны соответствующим базовым типам.
поэтому два утверждения ниже:
val a = SomeObjectA; typealias a2 = SomeObjectA;
избегая использования typealias
вызывающих ненужную ошибку компилятора, kotlin не включает все вложенные классы в typealias
.