Я новичок в Kotlin, и я начал новый проект Android, используя этот язык.С самого начала я столкнулся с некоторыми проблемами, когда пытался создать схему шаблона MVP в Kotlin с использованием универсальных типов.Вот что я пытаюсь сделать:
AbstractBasePresenter.kt
abstract class AbstractBasePresenter<T: Any> internal constructor(
private val compositeDisposable: CompositeDisposable = CompositeDisposable()
) {
constructor() : this(CompositeDisposable())
private var view: T? = null
fun bind(view: T) {
if (this.view != null) throw IllegalStateException("view already bound")
this.view = view
afterBind()
}
fun unbind() {
if (this.view == null) throw IllegalStateException("view already unbound")
this.view = null
compositeDisposable.clear()
}
abstract fun afterBind()
protected fun addDisposable(disposable: Disposable): Disposable =
disposable.also {
compositeDisposable.add(it)
}
protected fun view(): T = view ?: throw IllegalStateException("view not bound")
}
BaseView.kt
interface BaseView<T : AbstractBasePresenter<*>> {
fun getPresenter(): T
}
AbstractBaseActivity
abstract class AbstractBaseActivity<T : AbstractBasePresenter<*>> : AppCompatActivity(), BaseView<T> {
override fun onStart() {
super.onStart()
getPresenter().bind(this)
}
override fun onStop() {
getPresenter().unbind()
super.onStop()
}
override fun startActivity(intent: Intent?) {
super.startActivity(intent)
slideInRight(this)
}
override fun onBackPressed() {
super.onBackPressed()
slideOutRight(this)
}
}
Когда я пытаюсь использовать базовый класс, я хочу что-то вроде ниже:
SplashActivity
class SplashActivity : AbstractBaseActivity<SplashPresenter>(), SplashActivityView {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.splash_activity)
}
override fun getPresenter(): SplashPresenter {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
SplashPresenter
class SplashPresenter : AbstractBasePresenter<SplashActivityView>() {
override fun afterBind() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
SplashActivityView
interface SplashActivityView {
}
Идея заключается в том, что этот тип реализации работает нормально вЯва, но после преобразования кажется, что с универсальными типами из Kotlin я что-то упускаю, и я получил следующую ошибку в AbstractBaseActivity при привязке представления:
**getPresenter().bind(this)** ------> "this" is underlined and I have the error: **"Type mismatch. Required nothing AbstractBaseActivity<T> found"**
Пожалуйста, скажите мнегде я делаю что-то неправильно или предоставляю мне другой тип решения для достижения реальной области действия BaseActivity (связывание и удаление из одного места).Спасибо!