根据documentation创建了一个枚举类
enum class BitCount public constructor(val value : Int)
{
x32(32),
x64(64)
}
然后我试图在某个函数中声明一个变量
val bitCount : BitCount = BitCount(32)
但是存在编译错误
如何声明BitCount类型的变量并从Int
初始化它?
错误:(18,29)Kotlin:枚举类型无法实例化
答案 0 :(得分:44)
如其他答案中所述,您可以引用按名称存在的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)
如果您想根据数值enum
找到32
的实例,则可以按以下方式扫描值。使用enum
和companion object
函数创建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 }
}
}
然后调用该函数以获取匹配的现有实例:
val bits = BitCount.from(32) // results in BitCount.x32
很好漂亮。或者,在这种情况下,您可以从数字中创建enum
值的名称,因为您在两者之间具有可预测的关系,然后使用BitCount.valueOf()
。以下是配套对象中的新from()
函数。
fun from(findValue: Int): BitCount = BitCount.valueOf("x$findValue")
答案 1 :(得分:13)
枚举实例只能在枚举类声明中声明。
如果您想创建新的BitCount,只需添加它,如下所示:
enum class BitCount public constructor(val value : Int)
{
x16(16),
x32(32),
x64(64)
}
并在任何地方使用BitCount.x16
。
答案 2 :(得分:0)
那又怎么样:
enum class BitCount constructor(val value : Int)
{
x32(32),
x64(64);
companion object {
operator fun invoke(rawValue: Int) = BitCount.values().find { it.rawValue == rawValue }
}
}
然后您可以像建议的那样使用它:
val bitCount = BitCount(32)
如果在枚举情况下找不到值,它将返回null