У меня проблема, и я не могу ее решить. У меня есть интерфейс Presenter
который является общим и принимает любой подтип интерфейса MvpView
interface Presenter<in V : MvpView> { fun attachView(view: V) fun detachView() }
Тогда у меня есть еще один абстрактный класс BasePresenter
который является подтипом Presenter
abstract class BasePresenter<V : MvpView> : Presenter<V> { protected var mvpView: V? = null protected get override fun attachView(view: V) { this.mvpView = view } override fun detachView() { mvpView = null } }
И у меня есть класс
abstract class BaseMvpActivity<P : BasePresenter<T>, T : MvpView> : BaseActivity(), MvpView { @Inject lateinit protected var presenter: P protected abstract fun inject() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) inject() initPresenter(savedInstanceState) } protected fun initPresenter(savedInstanceState: Bundle?) { presenter.attachView(this) } override fun onDestroy() { presenter.detachView() super.onDestroy() } }
И там у меня ошибка при попытке вызвать presenter.attachView(this)
Type mismatch: inferred type is BaseMvpActivity<P, T> but T was expected
Я также попытался сделать этот abstract class BaseMvpActivity<P : BasePresenter<*>> : BaseActivity()
но также имеет такую ошибку, как Type mismatch: inferred type is BaseMvpActivity<P> but Nothing was expected
Как я могу решить эту проблему? Спасибо.
Почему вы хотите сделать BasePresetner
универсальным, поскольку вы не собираетесь возвращать значение этого родового типа. Мы используем generics для предотвращения приведения типов возвращаемого значения из метода и предотвращения возможных исключений Cast.
Что я хочу сказать, что вам не нужно делать BasePresenter
родовым. Просто объявите mvpView как MvpView и используйте его методы. Предположим, что если вы сделаете его общим, нет плюсовой точки, которую вы достигнете, потому что у вас все равно будет доступ к только методу MvpView (а не к sub-class
).
abstract class BasePresenter : Presenter<V> { protected var mvpView: MvpView = null protected get override fun attachView(view: MvpView) { this.mvpView = view } override fun detachView() { mvpView = null } }
Надеюсь, поможет.