reference - enum - kotlin this class
¿Por qué no puedo referirme a un objeto anidado de val o typealias que se refiere a un objeto? (2)
Considera el siguiente código:
object SomeObjectA {
object SomeObjectB {
val a = "test"
}
}
val X = SomeObjectA
typealias Y = SomeObjectA
SomeObjectA.SomeObjectB // works
X.SomeObjectB // error
Y.SomeObjectB // error
No puedo referirme a un objeto anidado (en un objeto externo) usando val
o typealias
que se refieren al objeto externo. ¿Por qué?
Lo que describió sucede porque SomeObjectA
en su ejemplo es simultáneamente un nombre de un objeto y el nombre de su clase.
Entonces, para acceder a SomeObjectB
, debe usar la sintaxis <classname>.<classname>
. Es por eso que X.SomeObjectB
no compila ( <object>.<classname>
no es compatible)
PD Esto realmente no explica su segundo problema con typealias
. A mí me parece un error, pero no estoy seguro.
el error del compilador viene de java, y los object
kotlin s convierten a java class
es como a continuación:
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
se compila en código java de la siguiente manera:
SomeObjectA.SomeObjectB.INSTANCE;
SomeObjectA
se compila en código java de la siguiente manera:
SomeObjectA.INSTANCE
sabemos que kotlin está basado en Java, y java no permite el acceso a las clases anidadas a través de la referencia de instancia, si lo hace, el compilador informará un error: " Error: java: tipo inesperado requerido: clase, paquete encontrado: variable ", para ejemplo:
SomeObjectA a = SomeObjectA.INSTANCE;
SomeObjectB b = a.SomeObjectB.INSTANCE;// error
// ^--- compiler don''t know where to go? package&class or variable?
el código a continuación, el compilador de kotlin transformará el error del compilador de Java como: " Error: Kotlin: objeto anidado ''SomeObjectB'' al que se accede mediante referencia de instancia ".
val a = SomeObjectA;
val b = a.SomeObjectB;
// ^--- Error
Los alias de tipo no introducen nuevos tipos. Son equivalentes a los tipos subyacentes correspondientes.
entonces las dos declaraciones a continuación son igualdad:
val a = SomeObjectA;
typealias a2 = SomeObjectA;
evitando el uso de typealias
causa un error innecesario del compilador, kotlin no incluye todas las clases anidadas en typealias
.