¿Cómo llamo a un método en Kotlin con un límite superior diferente?

Por ejemplo, dada una Class<T> ¿cómo invoco / invoco un método / constructor que requiere una Class<T> where T : Enum<T> ?

 fun <T : Any> handleAny(classOfT: Class<T>) { if (classOfT.isEnum) { handleEnum(classOfT) } } fun <T : Enum<T>> handleEnum(classOfT: Class<T>) { /*...*/ } 

Error: el infernetworking type T is not a subtype of kotlin.Enum<T>

En Java puedo hacer una llamada sin marcar, pero parece que no puedo encontrar una manera de hacer algo similar en Kotlin.

Por ahora, encontré esta solución bastante hacky para ello:

 private enum class DummyEnum fun <T> handleAny(classOfT: Class<T>) { if (classOfT.isEnum) { handleEnum(classOfT as Class<DummyEnum>) //absolutely any enum goes } } fun <T : Enum<T>> handleEnum(classOfT: Class<T>) { println(classOfT.toString()) } 

La idea es hacer un lanzamiento desactivado al tipo con cualquier parámetro genérico que satisfaga el límite superior (que sea DummyEnum ), que luego se borrará en time de ejecución de todos modos.

La limitación es que la solución no funciona correctamente con los generics reificados : si handleEnum tuviera el parámetro tipo reificado, se sustituiría por el tipo inferido estáticamente ( DummyEnum ).

  • Base de datos de android de Kotlin: no se puede convertir java.lang.String en android.database.Cursor
  • ¿Qué significa el código @TypeConverterAnnotation?
  • Recursión de Kotlin
  • Método de presentador de Fragmentos de llamada de Actividad
  • Función de tipo reificado de Kotlin como extensión de function. ¿Se puede invocar desde Java?
  • Confusión de la syntax de Kotlin lambda
  • Error al analizar: org.jetbrains.kotlin.kapt3.diagnostic.KaptError: Error al procesar la anotación
  • El logcat de Android Studio sigue funcionando
  • Cómo revertir un map en Kotlin?
  • IntelliJ (usando gradle): no se puede encontrar el complemento de Kotlin aunque esté instalado
  • ¿Cómo crear un IntArray de tamaño fijo e inicializar el array más adelante en Kotlin?