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

  • kotlin android start nuevo service
  • Al declarar Byte en Kotlin se produce el error en time de compilation 'El integer integer no se ajusta al tipo esperado Byte'
  • Kotlin con JPA: infierno de constructor pnetworkingeterminado
  • ¿Existe alguna forma más simple de express classs anónimas en Kotlin?
  • La aplicación se bloquea al intentar acceder a otra actividad
  • Cómo encontrar todas las classs en un package usando la reflexión en kotlin
  • ¿Ejecutando Kotlin Code en SBT / Play Framework?
  • ¿Cómo implementa HashMap la interfaz MutableMap en Kotlin?
  • En Android Java / Kotlin, ¿la implementación de una interfaz le da acceso directo a las variables locales de la class de anidación?
  • Kotlin "Cualquier tipo que implemente una interfaz"
  • ¿Cómo puedo completar mi constructor?