如何在 Kotlin 中声明枚举类型的变量?
How do I declare a variable of enum type in Kotlin?
在 the documentation 之后,我创建了一个枚举 class:
enum class BitCount public constructor(val value : Int)
{
x32(32),
x64(64)
}
然后,我尝试在某个函数中声明一个变量:
val bitCount : BitCount = BitCount(32)
但是出现编译错误:
Error:(18, 29) Kotlin: Enum types cannot be instantiated
如何声明 BitCount 类型的变量并从 Int
初始化它?
枚举实例只能在枚举 class 声明中声明。
如果您想创建新的 BitCount,只需如下所示添加它:
enum class BitCount public constructor(val value : Int)
{
x16(16),
x32(32),
x64(64)
}
并在任何地方使用 BitCount.x16
。
如其他答案所述,您可以引用按名称存在的 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)
如果您想根据数值 32
查找 enum
的实例,则可以按以下方式扫描这些值。使用 companion object
和 from()
函数创建 enum
:
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")
怎么样:
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)
如果在枚举案例中找不到值,它将 return 为 null
在 the documentation 之后,我创建了一个枚举 class:
enum class BitCount public constructor(val value : Int)
{
x32(32),
x64(64)
}
然后,我尝试在某个函数中声明一个变量:
val bitCount : BitCount = BitCount(32)
但是出现编译错误:
Error:(18, 29) Kotlin: Enum types cannot be instantiated
如何声明 BitCount 类型的变量并从 Int
初始化它?
枚举实例只能在枚举 class 声明中声明。
如果您想创建新的 BitCount,只需如下所示添加它:
enum class BitCount public constructor(val value : Int)
{
x16(16),
x32(32),
x64(64)
}
并在任何地方使用 BitCount.x16
。
如其他答案所述,您可以引用按名称存在的 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)
如果您想根据数值 32
查找 enum
的实例,则可以按以下方式扫描这些值。使用 companion object
和 from()
函数创建 enum
:
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")
怎么样:
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)
如果在枚举案例中找不到值,它将 return 为 null