Почему я не могу ссылаться на вложенный объект из val или typealias, ссылающихся на объект?

Рассмотрим следующий код:

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 .

  • Совместное использование функций расширения между Float и Double в Котлине
  • Котлин: Путаница с лямбдами и дженериками
  • Как бесконечно повторять последовательность в Котлине?
  • Функция расширения Kotlin
  • Глобальная функция расширения в котлине
  • пусть, также, применять, takeIf, takeUnless в Котлине
  • В kotlin функция tailroid tail возвращает 0
  • Как передать контекст Неявно для конструкторов в Котлине
  • Доступ к статической функции расширения из другого класса в Котлине?
  • Kotlin Dokka - Не удается найти задачу Dokka в андроид-студии
  • Класс Kotlin, реализующий ошибку интерфейса Java
  • Давайте будем гением компьютера.