编译器错误来自java,kotlinobjects转换成javaclasses如下:
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不允许通过实例引用访问嵌套类,如果这样做编译器会报错:“Error: java: unexpected type required: class,package发现:变量”,例如:
SomeObjectA a = SomeObjectA.INSTANCE;
SomeObjectB b = a.SomeObjectB.INSTANCE;// error
// ^--- compiler don't know where to go? package&class or variable?
以下代码,kotlin 编译器会将 java 编译器错误转换为:“Error: Kotlin: Nested object 'SomeObjectB' access via instance reference”。
val a = SomeObjectA;
val b = a.SomeObjectB;
// ^--- Error
类型别名不会引入新类型。它们等价于相应的底层类型。
所以下面的两个语句是相等的:
val a = SomeObjectA;
typealias a2 = SomeObjectA;
为了避免使用typealias 导致不必要的编译器错误,kotlin 不包含typealias 中的所有嵌套类。