Referencias cruzadas en parameters de tipo

Por ejemplo, en Java podría escribir:

public abstract class Element<S extends Snapshot> { ... } public abstract class Snapshot<E extends Element> { ... } 

Y luego, en algún lugar, extiende estas classs:

 public class SnapshotImpl extends Snapshot<ElementImpl> { ... } public class ElementImpl extends Element<SnapshotImpl> { ... } 

Pero cuando traté de implementar la misma jerarquía de classs en Kotlin:

 abstract class Element<S : Snapshot> abstract class Snapshot<E : Element> 

Obtuve los siguientes errores de compilation:

Error:(6, 28) Kotlin: One type argument expected for class Snapshot<E> defined in model Error:(6, 25) Kotlin: One type argument expected for class Element<S> defined in model

¿Hay alguna forma de reproducir las mismas restricciones de parameters de tipo en Kotlin?

Kotlin no tiene types brutos, no puedes simplemente descartar los parameters de tipo.

Una opción similar a los types sin formatting es usar proyecciones en estrella :

 abstract class Element<S : Snapshot<*>> { /* ... */ } abstract class Snapshot<E : Element<*>> { /* ... */ } 

Pero normalmente no podrá trabajar con los miembros generics de los parameters de tipo.


Otra opción es introducir restricciones mutuas como esta:

 abstract class Element<E : Element<E, S>, S : Snapshot<S, E>>() { /* ... */ } abstract class Snapshot<S : Snapshot<S, E>, E : Element<E, S>>() { /* ... */ } 

Con esta definición, puede estar seguro de que si define SomeSnapshot: Snapshot<SomeSnapshot, SomeElement> , el tipo SomeElement tiene conocimiento de SomeSnapshot , porque está obligado a derivarse de Element<SomeElement, SomeSnapshot> .

Entonces la implementación sería:

 class SomeElement : Element<SomeElement, SomeSnapshot>() { /* ... */ } class SomeSnapshot : Snapshot<SomeSnapshot, SomeElement>() { /* ... */ } 
  • ¿Puedo iniciar un valor perezoso dependiendo del constructor?
  • ¿Cómo manejar la class duplicada antes de la compilation kotlin-android?
  • La interoperabilidad Varargs Kotlin Java no funciona correctamente
  • Intentando cargar un file en la actividad principal de onCreate
  • ¿Cómo componer funciones con parmetros / types de resultados compatibles en Kotlin?
  • Tema de Kotlin Quasar y problema de locking de canales
  • Problema recursivo con toString en Kotlin
  • Problemas de subtipo con generics en Kotlin
  • Kotlin cuádruple, quíntuple, etc. para desestructurar
  • Android / Kotlin: reference no resuelta: madera
  • La demostración IOU de Corda V1.0 no funciona en Windows