Использование универсального с Kotlin и MVP Android - PullRequest
0 голосов
/ 22 ноября 2018

Я новичок в 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 (связывание и удаление из одного места).Спасибо!

...