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

时间:2017-06-09 10:22:59

标签: reference kotlin inner-classes

请考虑以下代码:

object SomeObjectA {
    object SomeObjectB {
        val a = "test"
    }
}

val X = SomeObjectA
typealias Y = SomeObjectA

SomeObjectA.SomeObjectB // works
X.SomeObjectB // error
Y.SomeObjectB // error

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

2 个答案:

答案 0 :(得分:7)

您所描述的内容是因为示例中的SomeObjectA同时是对象的名称​​和其类的名称。

因此,要访问SomeObjectB,您需要使用<classname>.<classname>语法。这就是为什么X.SomeObjectB无法编译(<object>.<classname>不受支持)

的原因

P.S。这并不能真正解释您typealias的第二个问题。对我来说这看起来像个小虫,但我不确定。

答案 1 :(得分:4)

编译器错误来自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不允许通过实例引用访问嵌套类,如果你这样做,编译器将报告错误:&#34; 错误:java:意外类型required:class,package found:variable &#34 ;,例如:

SomeObjectA a = SomeObjectA.INSTANCE;
SomeObjectB b = a.SomeObjectB.INSTANCE;// error 
             // ^--- compiler don't know where to go? package&class or variable?   

下面的代码,kotlin编译器会将java编译器错误转换为:&#34; 错误:Kotlin:嵌套对象&#39; SomeObjectB&#39;通过实例参考&#34;。

访问
val a = SomeObjectA;
val b = a.SomeObjectB;
//        ^--- Error
  

类型别名不会引入新类型。它们等同于相应的底层类型。

所以下面的两个陈述是平等的:

 val a = SomeObjectA;
 typealias a2 = SomeObjectA;

避免使用typealias导致不必要的编译器错误,kotlin并未在typealias中包含所有嵌套类。