Kotlin Genéricos: Migración problema desde Java

Karthik P:

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

George Antonioli:

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 selfparámetro de tipo (identificado con Sen mi ejemplo) y hacer que el selfpará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()
        }
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=282420&siteId=1
Recomendado
Clasificación