¿Hay alguna manera de anidar una enumeración dentro de una class de datos en Kotlin?

¿Hay alguna manera de anidar una enumeración dentro de una class de datos en Kotlin?

data class D(val a:Any) { enum class E {F,G} ... } 

¿O declararlo en línea dentro de una function?

 fun foo() { enum class E {F,G} doSomething() } 

No puedo encontrar documentation sobre las reglas para el que se permite declarar las enumeraciones.

No hay ninguna especificación de kotlin para la syntax en el presente. si desea encontrar la especificación, puede ver JLS , porque Kotlin está basado en Java, por lo que algunas especificaciones también son apropiadas en Kotlin.

Un tipo de enumeración nested es implícitamente estático . Se permite que la statement de un tipo de enumeración anidada especifique de forma networkingundante el modificador estático.

Esto implica que es imposible declarar un tipo de enumeración en el cuerpo de una class interna (§8.1.3), porque una class interna no puede tener miembros estáticos a exception de las variables constantes .

y, todas las classs locales son classs internas .

Por lo tanto, la class enum se puede declarar en cualquier lugar, excepto el scope de la function local y inner classs inner .

Si no está seguro de dónde puede definir un tipo, puede intentar solicitar el scope a su vez: local > class > top , luego el comstackdor de kotlin le dará el post de error de compilation correcto. por ejemplo:

SI define una const val en la function local, el comstackdor informa el error de la siguiente manera:

 fun local() { const val foo="bar" // ^--- the modifier `const` is not applicable to `local variable` } 

SI define una const val en la class / interfaz común, el comstackdor informará el error de la siguiente manera:

 interface Foo { const val foo = "bar" //^--- `const val` only allowed on top-level or objects. } 

Sí, puedes anidar la enumeración como una class de datos, pero no en una function:

 data class Outer(val a: InnerEnum) { enum class InnerEnum { A, B } } fun foo() { val o = Outer(Outer.InnerEnum.A) println(o) // --> Outer(a=A) }