有没有办法在Kotlin的数据类中嵌入枚举?
data class D(val a:Any) {
enum class E {F,G}
...
}
或者在函数内声明它内联?
fun foo() {
enum class E {F,G}
doSomething()
}
我找不到关于允许声明枚举的规则的文档。
答案 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.
}