Что-то в Enums меня смущает. Я хотел бы, чтобы функция «знала» обо всех возможных сопоставлениях порядкового номера/имени Enum, но передача моего класса перечисления в функцию работает неправильно.
fun printEnumOrdinalAndNames(targetEnumType:???)
Я могу взломать его на вызывающей стороне с помощью
println(MY_ENUM_TYPE.values().map { it.ordinal to it.name }.toMap())
но я не уверен, смогу ли я каким-то образом передать MY_ENUM_TYPE::class или что-то подобное, я не могу получить сигнатуру функции, чтобы принять любое перечисление. printEnumOrdinalAndNames(MY_ENUM_TYPE) не будет компилироваться, потому что это недопустимый синтаксис.

Вы можете написать функцию с типом reified, чтобы сделать это на любом Enum. Когда у вас есть класс, вы можете сопоставить его 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}
Вы можете использовать enumValues() для получения констант произвольного enum, как описано в Классы Enum — язык программирования Kotlin. Для этого требуется встроенная функция с овеществленным типом:
inline fun <reified T : Enum<T>> ordinalsAndNamesOf() =
enumValues<T>().map { it.ordinal to it.name }.toMap()
И его использование будет выглядеть так:
fun main() {
println(ordinalsAndNamesOf<Foo>())
}
enum class Foo {
BAR, BAZ, QUX
}
Очевидно, я не знаю, как использовать reified. Отлично сработало, спасибо!