example enum reference kotlin inner-classes

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 .