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

Jul*_* A. 2 syntax enums kotlin

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

data class D(val a:Any) {
    enum class E {F,G}
    ...
}
Run Code Online (Sandbox Code Playgroud)

还是在函数中内联声明?

fun foo() {
    enum class E {F,G}
    doSomething()
}
Run Code Online (Sandbox Code Playgroud)

我找不到有关允许声明枚举的规则的文档。

gue*_*ter 6

是的,您可以将枚举嵌套在数据类中,但不能嵌套在函数中:

data class Outer(val a: InnerEnum) {
    enum class InnerEnum { A, B }
}

fun foo() {
    val o = Outer(Outer.InnerEnum.A)
    println(o) // --> Outer(a=A)
}
Run Code Online (Sandbox Code Playgroud)


hol*_*ava 6

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

\n
\n

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

\n

这意味着不可能在内部类(\xc2\xa78.1.3)的主体中声明枚举类型,因为内部类不能拥有除常量变量之外的静态成员。

\n

并且,所有本地类都是内部类。

\n
\n

因此,类可以在函数作用域和类enum之外的任何地方声明。localinner

\n

如果你不确定在哪里可以定义类型,你可以尝试依次提示范围: >> ,local然后kotlin 编译器会给你正确的编译器错误消息。例如:classtop

\n

如果在本地函数中定义 a const val,编译器会报告如下错误:

\n
fun local() {\n    const val foo="bar"\n    // ^--- the modifier `const` is not applicable to `local variable`  \n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果在公共类/接口中定义a const val,编译器将报告如下错误:

\n
interface Foo {\n  const val foo = "bar"\n  //^--- `const val` only allowed on top-level or objects.\n}\n
Run Code Online (Sandbox Code Playgroud)\n