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) }"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 } }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 .