Функция Kotlin для печати всех порядковых / именных пар Enum - PullRequest
1 голос
/ 13 мая 2019

Что-то в 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) не будет компилироваться, потому что это неверный синтаксис.

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Вы можете написать функцию с типом 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}
1 голос
/ 13 мая 2019

Вы можете использовать enumValues(), чтобы получить константы произвольного enum, как описано в Enum Classes - Kotlin Programming Language . Требуется встроенная функция с ограниченным типом:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...