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

时间:2017-07-04 17:56:33

标签: syntax enums kotlin

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

fun foo() {
    val o = Outer(Outer.InnerEnum.A)
    println(o) // --> Outer(a=A)
}

答案 1 :(得分:2)

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

  

嵌套枚举类型隐含静态。允许声明嵌套枚举类型以冗余地指定静态修饰符。

     

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

     

并且,所有local class es都是内部类。

所以 enum类可以在local函数范围和inner类之外的任何地方声明。

如果您不确定在哪里可以定义类型,可以尝试依次提示范围:local> class> top,然后kotlin编译器将为您提供正确的编译器错误消息。例如:

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

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

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

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