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)
我不能引用使用val或typealias引用外部对象的嵌套对象(在外部对象中).为什么?
你描述的,因为发生SomeObjectA在你的例子是同步对象的名称和它的类的名称.
因此,要访问SomeObjectB,您需要使用<classname>.<classname>语法.这就是为什么X.SomeObjectB不编译(<object>.<classname>不支持)
PS这并不能解释你的第二个问题typealias.它对我来说就像一个小虫,但我不确定.
编译器错误来自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.
| 归档时间: |
|
| 查看次数: |
1201 次 |
| 最近记录: |