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

275
Vistas
Kotlin Generics - genérico recursivo - falla la conversión de la instancia del tipo borrado

Cuando itero sobre una lista de Sprites y compruebo si implementan UsesObjectPool o no, me encuentro con estos problemas debido al borrado de tipos:

* Si trato de verificar su tipo, obtengo:

No se puede verificar la instancia del tipo borrado: UsesObjectPool

 if(it is UsesObjectPool<Sprite>) { it.objectPool.releaseObject(it) }



  • Si uso el comodín * para verificar, dice que:

"parámetro requerido Nada, Sprite encontrado y UsesObjectPool:

 if(it is UsesObjectPool<*>) { it.objectPool.releaseObject(it) }



* Si lo envío a UsesObjectPool, obtengo:

El argumento de tipo no está dentro de sus límites. Esperado: UsesObjectPool Encontrado: Sprite

 if(it is UsesObjectPool<*>) { (it as UsesObjectPool<Sprite>).objectPool.releaseObject(it) }



La clase genérica y la interfaz:

 interface UsesObjectPool<T> where T :UsesObjectPool<T>, T : Sprite { val objectPool: BaseObjectPool<T> } abstract class BaseObjectPool<T> where T : UsesObjectPool<T>, T : Sprite { fun releaseObject(instance: T) { //Implementation } }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

El problema aquí es que en realidad no está diciendo que T debería ser el tipo de implementación (conocido como Self en algunos idiomas). En lo que respecta al compilador de Kotlin, T puede ser cualquier otro tipo que implemente UsesObjectPool<T> . Es por eso que no puede pasarlo it releaseObject .

Aquí hay un ejemplo:

 class EvilObjectPool<T>: BaseObjectPool<T>() where T : UsesObjectPool<T>, T : Sprite class Implementation : Sprite(), UsesObjectPool<Implementation> { override val objectPool: BaseObjectPool<Implementation> get() = EvilObjectPool() } class EvilImplementation : Sprite(), UsesObjectPool<Implementation> { override val objectPool: BaseObjectPool<Implementation> get() = EvilObjectPool() }

Tenga en cuenta que esto compila . En general, nosotros, como humanos, reconocemos este patrón de "genéricos autoatados", y nunca escribiremos algo como EvilImplementation , pero el compilador no lo sabe :(

Ahora imagina it es EvilImplementation . it.objectPool.releaseObject aceptaría una Implementation , ¡pero le estás dando una EvilImplementation !

De todos modos, creo que deberías repensar tu diseño, ya que Kotlin no es compatible con Self como en otros idiomas.

Vea también un problema similar en Java .

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