Котлин: разрешить родовое наследование

Прочитав те же статьи, я все еще не могу решить проблему дженериков:

У меня есть BaseActivity:

abstract class BaseActivity : MvpAppCompatActivity(), BaseView {
    abstract fun getPresenter():BasePresenter<BaseView>
}

Интерфейс BaseView для него

interface BaseView : MvpView

И наверняка BasePresenter

open class BasePresenter<T : BaseView> : MvpPresenter<T>() 

Затем я создаю BaseConnectionView

interface BaseConnectionView : BaseView

И BaseConnectionPresenter

class BaseConnectionPresenter<T : BaseConnectionView> : BasePresenter<T>()

Поэтому, когда я создаю BaseConnectionActivity

abstract class BaseConnectionActivity : BaseActivity(),BaseConnectionView {
    override abstract fun getPresenter(): BaseConnectionPresenter<BaseConnectionView>
}

У меня ошибка:

Return type is BaseConnectionPresenter<BaseConnectionView>, 
which is not a subtype of overridden 
public abstract fun getPresenter():BasePresenter<BaseView>

Но это подтип!

Как я могу решить эту проблему?

2 ответа

Решение

Решение было проще, чем я думаю, если использовать звездные проекции

Так что в BaseActivity я заменил

abstract fun getPresenter():BasePresenter<BaseView>

к

abstract fun getPresenter():BasePresenter<*>

И тогда я могу просто переопределить это с новым докладчиком, как

override abstract fun getPresenter(): BaseConnectionPresenter<*>

BaseConnectionPresenter это подтип BasePresenter<T> с T: BaseConnectionView, Функция getPresenter только возвращается BasePresenter<BaseView>, Есть проблема, потому что BasePresenter<T> не гарантируется BasePresenter<BaseView>, Следующее исправляет это:

class BaseConnectionPresenter<T : BaseConnectionView> : BasePresenter<BaseView>()
Другие вопросы по тегам