如何在Kotlin中声明枚举类型的变量?

Ed.*_*ard 27 enums kotlin

根据文档创建了一个枚举类

enum class BitCount public constructor(val value : Int)
{
  x32(32),
  x64(64)
}
Run Code Online (Sandbox Code Playgroud)

然后我试图在某个函数中声明一个变量

val bitCount : BitCount = BitCount(32)
Run Code Online (Sandbox Code Playgroud)

但是有一个编译错误

如何声明BitCount类型的变量并从中初始化它Int

错误:(18,29)Kotlin:枚举类型无法实例化

Jay*_*ard 51

如其他答案中所述,您可以引用enum按名称存在的任何值,但不能构造新值.这并不妨碍你做类似你尝试的事情......

// wrong, it is a sealed hierarchy, you cannot create random instances
val bitCount : BitCount = BitCount(32)

// correct (assuming you add the code below)
val bitCount = BitCount.from(32)
Run Code Online (Sandbox Code Playgroud)

如果您想要找到enum基于数值的实例,32那么您可以按以下方式扫描值.enum使用a companion object和a from()函数创建:

enum class BitCount(val value : Int)
{
    x16(16),
    x32(32),
    x64(64);

    companion object {
        fun from(findValue: Int): BitCount = BitCount.values().first { it.value == findValue }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用该函数以获取匹配的现有实例:

val bits = BitCount.from(32) // results in BitCount.x32
Run Code Online (Sandbox Code Playgroud)

很漂亮.或者,在这种情况下,您可以enum从数字中创建值的名称,因为您可以在两者之间建立可预测的关系,然后使用BitCount.valueOf().这是from()伴随对象中的新函数.

fun from(findValue: Int): BitCount = BitCount.valueOf("x$findValue")
Run Code Online (Sandbox Code Playgroud)

  • 变体:1)`when`超过可能的输入,正确处理'else`.2)使用`firstOrNull`并使`from`的返回值为optional.3)[预处理地图](http://stackoverflow.com/a/37795810/539599). (2认同)

use*_*698 13

枚举实例只能在枚举类声明中声明.

如果你想创建新的BitCount,只需添加它,如下所示:

enum class BitCount public constructor(val value : Int)
{
    x16(16),
    x32(32),
    x64(64)
}
Run Code Online (Sandbox Code Playgroud)

并在任何地方使用BitCount.x16.

  • 这就是课程的用途. (2认同)

Ang*_*qui 7

关于什么:

enum class BitCount constructor(val value : Int)
{
    x32(32),
    x64(64);

    companion object {
         operator fun invoke(rawValue: Int) = BitCount.values().find { it.rawValue == rawValue }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像你建议的那样使用它:

val bitCount = BitCount(32)
Run Code Online (Sandbox Code Playgroud)

如果在枚举情况下找不到值,它将返回 null