首页 > 解决方案 > Kotlin 函数打印所有枚举的序数/名称对

问题描述

关于 Enums 的一些事情让我感到困惑。我想要一个函数来“了解”所有可能的枚举序数/名称映射,但是将我的枚举类传递给函数无法正常工作。

fun printEnumOrdinalAndNames(targetEnumType:???)

我可以在调用端破解它

println(MY_ENUM_TYPE.values().map { it.ordinal to it.name }.toMap())

但不确定我是否可以以某种方式传入 aMY_ENUM_TYPE::class或类似的,我无法获得函数签名以接受任何 EnumprintEnumOrdinalAndNames(MY_ENUM_TYPE)不会编译,因为它不是有效的语法。

标签: genericskotlinenums

解决方案


您可以编写一个具有reified类型的函数来在任何Enum. 一旦你有了这个类,你可以将它映射enumContstants到你想要的任何东西(Map<String,Int>在这种情况下是 a),或者如果你愿意,可以修改它以打印它们。

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}

推荐阅读