为什么我不能引用val或指向对象的typealias的嵌套对象?

考虑下面的代码:

object SomeObjectA { object SomeObjectB { val a = "test" } } val X = SomeObjectA typealias Y = SomeObjectA SomeObjectA.SomeObjectB // works X.SomeObjectB // error Y.SomeObjectB // error 

我不能使用引用外部对象的valtypealias引用嵌套对象(在外部对象中)。 为什么?

你所描述的是因为你的例子中的SomeObjectA同时是一个对象的名称和它的类的名字。

所以要访问SomeObjectB ,你需要使用<classname>.<classname>语法。 这就是为什么X.SomeObjectB不能编译( <object>.<classname>不被支持)

PS这不能真正解释你的第二个问题与typealias 。 它看起来像一个错误,但我不知道。

编译器错误来自java,而kotlin object转换为java class es,如下所示:

 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.INSTANCE; 

SomeObjectA被编译成java代码如下:

 SomeObjectA.INSTANCE 

我们知道kotlin是基于java的,java不允许通过实例引用访问嵌套类,如果你这样做的话编译器会报错:“ 错误:java:unexpected type required:class,package found:variable ”,for例:

 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中的所有嵌套类。

    Interesting Posts