generics - Kotlin函数可打印所有枚举的序数/名称对

标签 generics kotlin enums

关于枚举的某些事情使我感到困惑。我想要一个“了解”所有可能的Enum序数/名称映射的函数,但是将我的enum类传递给函数却无法正常工作。
fun printEnumOrdinalAndNames(targetEnumType:???)
我可以在调用方解决它
println(MY_ENUM_TYPE.values().map { it.ordinal to it.name }.toMap())
但是不确定是否可以通过某种方式传递MY_ENUM_TYPE::class或类似的代码,我无法获得正确的函数签名来接受任何Enum printEnumOrdinalAndNames(MY_ENUM_TYPE)无效,因此无法编译。

最佳答案

您可以编写一个reified类型的函数来对任何Enum进行此操作。上完类(class)后,您可以将其enumContstants映射到所需的任何内容(在本例中为Map<String,Int>),也可以根据需要进行修改以打印它们。

inline fun <reified T : Enum<*>> namesAndOrdinalsOf(): Map<String,Int> =
    T::class.java.enumConstants.map {
        it.name to it.ordinal
    }.toMap()

编辑:我不知道enumValues<T>()存在(感谢@Slaw),您可以像这样重写它,因为它更简单:
inline fun <reified T : Enum<T>> namesAndOrdinalsOf(): Map<String,Int> =
    enumValues<T>().map {
        it.name to it.ordinal
    }.toMap()

并使用它:
enum class Things {
    Grapes,
    Chairs,
    Spectacles
}

fun main() {
    println(namesAndOrdinalsOf<Things>())
}
// Prints: {Grapes=0, Chairs=1, Spectacles=2}

关于generics - Kotlin函数可打印所有枚举的序数/名称对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56117185/

相关文章:

Java 泛型问题(带 Spring)

java - 如何在同一 Activity 中使用不同的 View

java - 如何向 EditTextPreference 添加消息?

generics - Vala - 打印通用值

c# - 使用泛型在 C# 中获取数组元素的总和

enums - Kotlin ENUM 类具有由委托(delegate)实现的通用接口(interface)

c# - 当从 C# 中的动态获取属性时,如何检查枚举属性?

c# - 在 C++\CLI 中转换枚举的问题

java - 为什么不能将通配符 (?) 用作参数类型、字段、局部变量或方法的返回类型?

java - Kotlin 中 for 循环的 IndexOutOfBoundsException