请考虑以下代码:
object SomeObjectA {
object SomeObjectB {
val a = "test"
}
}
val X = SomeObjectA
typealias Y = SomeObjectA
SomeObjectA.SomeObjectB // works
X.SomeObjectB // error
Y.SomeObjectB // error
我不能使用引用外部对象的val
或typealias
来引用嵌套对象(在外部对象中)。为什么呢?
答案 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
中包含所有嵌套类。