Problemas de subtipo con generics en Kotlin

Tengo el siguiente patrón de inheritance en mi código.

trait A { fun foo(): Set<A> } trait B : A { override fun foo(): MutableSet<B> } trait C : A { override fun foo(): Set<C> } trait D : C, B { override fun foo(): MutableSet<D> } 

Cuando B y D devuelven sets, el comstackdor puede determinar que Set<D> es un subtipo de Set<B> y Set<C> . Sin embargo, cuando cambio los types de B.foo de B.foo y D.foo a MutableSet , el comstackdor puede validar el tipo de B.foo de B.foo pero recibo un error que informa que el tipo de D.foo de D.foo no es un subtipo de MutableSet<B> .

¿Por qué Kotlin no puede inferir esta forma de subtypes y existe una solución alternativa sin modificar mi jerarquía?

El tipo de devolución de una function principal debe ser un subtipo del reemplazado. En su ejemplo, MutableSet<D> no es un subtipo de MutableSet<B> . Si lo fuera, un código similar podría causar una exception en el time de ejecución:

 trait B { fun foo(): MutableSet<B> } trait D : B { override fun foo(): MutableSet<D> fun onlyInD() {} } class BImpl : B { override fun foo() = null!! } class DImpl : D { private val set = java.util.HashSet<D>() override fun foo() = set } fun main(args: Array<String>) { val impl = DImpl() // two variables pointing to the same instance val b: B = impl val d: D = impl b.foo().add(BImpl()) // ClassCastException on the next line: BImpl is not an instance of D d.foo().first().onlyInD() } 

Ver ejemplo en vivo en try.kotl.in

  • Principal Ui congela
  • Crear class extender AsyncTask sin fugas de objects de context en Android Kotlin
  • Convención de encoding para funciones vacías que deben ser anuladas en Kotlin
  • ¿Por qué son válidos tanto val box1 como val box2 en Kotlin?
  • Notificado cuando la var lateinit se ha inicializado (Kotlin)
  • Kotlin: los tiros de comparación de maps fallan incluso si los maps son iguales
  • Kotlin Cualquiera con lambdas
  • Android Library Module desarrollado en Kotlin exportado a la aplicación Java causando una resolución fallida de: Lkotlin / jvm / internal / Intrinsics
  • Por qué no puedo hacer reference a los arguments del constructor dentro de la class al definir el object
  • Adaptador de unión con múltiples arguments en Kotlin
  • App build.gradle.kts Archivo sin resolver Erros de reference