有没有办法在Kotlin的数据类中嵌套一个枚举?

有没有办法在Kotlin的数据类中嵌套一个枚举?

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

或者在函数中声明它内联?

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

我无法找到允许声明枚举的规则的文档。

目前没有关于语法的kotlin规范。 如果你想找到规范,你可以看到JLS ,因为Kotlin是基于Java的,所以有些规范也适用于Kotlin。

嵌套的枚举类型是隐式静态的 。 允许声明嵌套的枚举类型来冗余地指定静态修饰符。

这意味着在内部类(§8.1.3)的主体中声明一个枚举类型是不可能的,因为除了常量变量外,内部类不能有静态成员。

而且,所有的地方课都是内部的课。

所以 enum类可以在除了local函数作用域和inner类之外的任何地方声明。

如果你不确定哪里可以定义一个类型,你可以尝试依次提示scope: local > class > top ,那么kotlin编译器会给你正确的编译器错误信息给你。 例如:

如果你在本地函数中定义了一个const val ,编译器会报错,如下所示:

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

如果你在普通的类/接口中定义了一个const val ,编译器会报错,如下所示:

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

是的,你可以嵌套枚举一个数据类,但不是在一个函数:

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