Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

294
Vistas
La función en línea reificada en Kotlin aún conduce a un error del compilador en la verificación 'es'

tengo la siguiente función:

 inline fun <reified T> create(preference: Preference<T>, title: String = ""): DebugOption{ val type = when (preference) { is Preference<String> -> Type.STRING is Preference<Boolean> -> Type.BOOLEAN else -> Type.STRING } return DebugOption(type, preference, displayTitle = StringModel(title)) }

Esperaba poder realizar fácilmente esta verificación 'es', ya que el tipo genérico está cosificado, pero sigo recibiendo un error de compilación:

 Cannot check for instance of erased type: Preference<String> Cannot check for instance of erased type: Preference<Boolean>

Así que estoy confundido, ¿cómo estoy usando mal 'reificado' / qué me estoy perdiendo aquí? ¿Hay algún problema con el uso de tipos genéricos cosificados como parámetro de tipo de otra clase?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

El problema is que comprueba el tipo de preferencia de tiempo de ejecución preference y el tipo de preference de tiempo de ejecución no está disponible hasta que se haya borrado toda la información de tipo genérico. Después de todo, los tipos cosificados no son mágicos.

En cambio, lo que puede hacer es verificar T , ya que, como dijo, T está cosificado.

 val type = when (T::class) { String::class -> Type.STRING Boolean::class -> Type.BOOLEAN else -> Type.STRING }

Pero tenga en cuenta que si Preference es covariante (como List ) o contravariante, esto podría no funcionar como esperaba en algunos casos. Por ejemplo:

 // suppose Preference is covariant // (ie the type parameter is declared <out T>) val pref: Preference<Any> = Preference<Boolean>() create(pref, "foo")

En este caso, se infiere que T es Any , por lo que al type se le asignará Type.STRING . Si eso es inesperado para usted y desea Type.BOOLEAN en su lugar, es posible que desee usar otra forma de verificar el tipo de una preferencia, en lugar de los tipos cosificados, ya que esto no se puede determinar en el momento de la compilación.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda