Как проверить, является ли тип перечислением в Kotlin? - PullRequest
0 голосов
/ 02 июля 2018

Во время выполнения я пытаюсь проверить, является ли конкретный KClass<out Any> типом перечисления.

Каков наилучший способ сделать это? Можно ли это сделать, не полагаясь на конкретную среду выполнения (например, JVM или JS)?

fun isEnum( type: KClass<out Any> ): Boolean
{
    ... ?
}

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Также решение только для JVM, но более короткое, с использованием isSubClassOf:

fun isEnum(type: KClass<out Any>) = type.isSubclassOf(Enum::class)
0 голосов
/ 10 августа 2018

JVM специфично

Ни одно из решений здесь не работало на меня (у меня было KType), поэтому я предложил другой подход. Вот решение для преобразования KClass в KType и последующей проверки, является ли KType перечислением.

fun isEnum(kClass: KClass<out Any> ): Boolean {
    val kType :KType = kClass::class.createType()
    return (kType.javaType  as Class<*>).isEnum
}
0 голосов
/ 02 июля 2018

Следующее, кажется, работает, полагаясь на полное имя типа.

fun isEnum( type: Kclass<out Any> ): Boolean
{
    return type.supertypes.any { t ->
        (t.classifier as KClass<out Any>).qualifiedName == "kotlin.Enum" }
}

Однако я не проверял, будет ли это работать и для JS, но я верю в это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...