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

Nae*_*mul 18 reference inner-classes kotlin

请考虑以下代码:

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

val X = SomeObjectA
typealias Y = SomeObjectA

SomeObjectA.SomeObjectB // works
X.SomeObjectB // error
Y.SomeObjectB // error
Run Code Online (Sandbox Code Playgroud)

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

vod*_*dan 7

你描述的,因为发生SomeObjectA在你的例子是同步对象的名称它的类的名称.

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

PS这并不能解释你的第二个问题typealias.它对我来说就像一个小虫,但我不确定.


hol*_*ava 5

编译器错误来自java,kotlin objects转换为java classes如下:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

SomeObjectA.SomeObjectB 编译成java代码如下:

SomeObjectA.SomeObjectB.INSTANCE;
Run Code Online (Sandbox Code Playgroud)

SomeObjectA 编译成java代码如下:

SomeObjectA.INSTANCE
Run Code Online (Sandbox Code Playgroud)

我们知道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?   
Run Code Online (Sandbox Code Playgroud)

在下面的代码中,kotlin 编译器会将 java 编译器错误转换为:“错误:Kotlin:通过实例引用访问的嵌套对象 'SomeObjectB' ”。

val a = SomeObjectA;
val b = a.SomeObjectB;
//        ^--- Error
Run Code Online (Sandbox Code Playgroud)

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

所以下面的两个语句是相等的:

 val a = SomeObjectA;
 typealias a2 = SomeObjectA;
Run Code Online (Sandbox Code Playgroud)

为避免使用typealias导致不必要的编译器错误,kotlin 不包含typealias.