Kotlin Generics: проблема перехода с Java - PullRequest
2 голосов
/ 13 марта 2020

Я новичок в Kotlin. При попытке преобразовать приложение java в Kotlin я столкнулся со следующей проблемой, поэтому разместил этот вопрос.

Это приложение связывания моделей и вот интерфейсы java. Ключевым моментом является то, что модель и вид взаимозависимы.

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());

Могу ли я сделать это в Kotlin?

Я попробовал следующее

interface Model<T : View<*>> {}

ОШИБКА: этот параметр типа нарушает ограничение конечных границ

interface Model<T : View<Any>> {}

ОШИБКА: аргумент типа находится за его пределами: должен быть подтипом 'Model <*>'

interface Model<T : View<Model<*>>> {}

ОШИБКА: этот параметр типа нарушает ограничение конечных границ

1 Ответ

0 голосов
/ 13 марта 2020

Нельзя преобразовать 1: 1 в Kotlin, поскольку Kotlin ограничивает параметры типа cycli c.

Вы можете решить эту проблему, добавив новый параметр типа, который другие языки изначально поддерживают, но не Kotlin, который является параметром типа self (в моем примере это S) и сделав self параметр типа и другой параметр типа как ковариантный типы (с использованием 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()
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...