Soy nuevo en Kotlin. Al intentar convertir una aplicación Java para Kotlin me encontré con el siguiente tema para publicar esta pregunta.
Esta es una aplicación modelo-vista-aglutinante y aquí están las interfaces Java. Lo clave es modelo y la vista son interdependientes unos de otros.
interface Model<T extends View<?>> {}
interface View<T extends Model<?>> {}
class RealModel implements Model<RealView> {}
class RealView implements View<RealModel> {}
class Binder<T extends Model<?>> {
static <ModelT extends Model<?>> Binder<ModelT> of(View<ModelT> view) {}
}
// Application code
Binder<RealModel> binder = Binder.of(new RealView());
binder.bind(new RealModel());
¿Puedo hacer esto en Kotlin?
He intentado lo siguiente
interface Model<T : View<*>> {}
ERROR: Este parámetro tipo viola la restricción Bound Finite
interface Model<T : View<Any>> {}
ERROR: Tipo de argumento no está dentro de sus límites: debe ser subtipo de 'Modelo <*>'
interface Model<T : View<Model<*>>> {}
ERROR: Este parámetro tipo viola la restricción Bound Finite
No se puede convertirlo 1: 1 en Kotlin desde Kotlin restringir los parámetros de tipo cíclico.
Se puede resolver añadiendo un nuevo parámetro de tipo que otros lenguajes soportan de forma nativa, pero Kotlin no lo hace, que es el self
parámetro de tipo (identificado con S
en mi ejemplo) y hacer que el self
parámetro de tipo y el otro tipo de parámetro como covariantes tipo (usando out
):
interface Model<out S : Model<S, T>, out T : View<T, S>>
interface View<out S : View<S, T>, out T : Model<T, S>>
class RealModel : Model<RealModel, RealView>
class RealView : View<RealView, RealModel>
class Binder<T : Model<*, *>> {
companion object {
fun <ViewT : View<*, ModelT>, ModelT : Model<ViewT, *>> of(view: ViewT): Binder<ModelT> {
throw RuntimeException()
}
}
}