Вынудить более конкретный тип подкласса с помощью Generics в Kotlin - PullRequest
0 голосов
/ 13 февраля 2019

Я работаю над библиотекой, имеющей несколько интерфейсов, связанных друг с другом.

Основной пример - ViewModel<M: Model, W: Widget>.Тогда у нас есть интерфейс для Model и интерфейс для Widget.

В интерфейсе виджета есть метод, который принимает объект ViewModel, а затем использует его для настройки.

abstract fun configure(viewModel: ViewModel<M: Model, W: Widget>)

Я ищу способ сделать этометод требует реализации подкласса ViewModel, а не только интерфейса.

Таким образом, для ContainerWidget потребуется этот метод: fun configure(viewModel: ContainerViewModel)

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

Кто-нибудь знает такой вариант для Kotlin?

Большое спасибо за помощь.

abstract class WLViewModel<DataModel : WLDataModel, WidgetType : WLWidget>(val dataModel: DataModel) {
    abstract fun configure(view: WidgetType)
}

interface WLWidget {
    var viewModel: WLViewModel<WLDataModel, WLWidget> 

    fun <M, O : WLDataModel, T : WLWidget> configure(viewModel: M) where M : WLViewModel<O, T>
}

interface WLDataModel

fun WLWidget.create(viewModel: WLViewModel<WLDataModel, WLWidget>) {
    configure(viewModel)
}

1 Ответ

0 голосов
/ 13 февраля 2019

Я не думаю, что есть хороший способ, я боюсь.

Традиционный Java-подход обманывает его, используя параметры рекурсивного типа.Вы могли бы дать своему WLWidget интерфейсу параметр типа фактического подкласса, например WLWidget<T : WLWidget<T>>, и затем внести все изменения при включении.Но это безобразно и не обрабатывает все случаи.( См. эти другие вопросы для получения дополнительной информации.)

Было обсуждение о добавлении собственных типов в Kotlin, что, вероятно, будет лучшим вариантом для вашего случая, но они еще не здесь.

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