generics - Kotlin 函数打印所有枚举的序数/名称对
问题描述
关于 Enums 的一些事情让我感到困惑。我想要一个函数来“了解”所有可能的枚举序数/名称映射,但是将我的枚举类传递给函数无法正常工作。
fun printEnumOrdinalAndNames(targetEnumType:???)
我可以在调用端破解它
println(MY_ENUM_TYPE.values().map { it.ordinal to it.name }.toMap())
但不确定我是否可以以某种方式传入 aMY_ENUM_TYPE::class
或类似的,我无法获得函数签名以接受任何 Enum。 printEnumOrdinalAndNames(MY_ENUM_TYPE)
不会编译,因为它不是有效的语法。
解决方案
您可以编写一个具有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}
推荐阅读
- ios - 带有 UIAppearance 的自定义类上的圆形按钮
- html - h,b 和 sup 标签什么都不做 + 更多问题
- php - 拉拉维尔 5.6。如何在 WHERE 条件下使用变量?
- pandas - 基于行数的子集
- hyperledger-fabric - 在运行我的第一个网络时,对等链码 instatiate 挂起
- android - 运行地图活动时应用程序崩溃
- apache-beam - Apache Beam - 用于运动流的滑动窗口
- html - Apache 2.4 的 HTTP 授权条件规则
- javascript - TypeError:x 不是 Node.js 中的函数
- reactjs - React JS - 使用本地 JSON 文件时如何传递变量(参数)?