Котлин: разрешить родовое наследование
Прочитав те же статьи, я все еще не могу решить проблему дженериков:
У меня есть 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>()