gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:30:19 34 4
gpt4 key购买 nike

考虑以下代码:

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

val X = SomeObjectA
typealias Y = SomeObjectA

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

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

最佳答案

编译器错误来自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();
}
}

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

Type aliases do not introduce new types. They are equivalent to the corresponding underlying types.

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

 val a = SomeObjectA;
typealias a2 = SomeObjectA;

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

关于reference - 为什么我不能从引用对象的 val 或 typealias 引用嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44455328/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com