简体   繁体   中英

how to pass generic class implementing generic interface to another generic class Kotlin

Hi I am new to programming and trying to implement MVP pattern by passing generic Presenter class LoginPresenter to Generic Model Class LoginUserModel but getting type mismatch error. on loginUserModel.onAttach(this) and I am unable to figure out how to pass pass generic interface to another class.

Login Presenter

class LoginPresenter<V : ILoginView>: BasePresenter<V>(), ILoginPresenter<V> {
    lateinit var loginUserModel: LoginUserModel<ILoginPresenter<ILoginView>>
    lateinit var iLoginPresenter: ILoginPresenter<V>
    .........
    .........
    override fun setupModel() {
           iLoginPresenter = this
           loginUserModel = LoginUserModel()
           // here i am getting error
           /**
             Type mismatch.
             Required:
             ILoginPresenter<ILoginView>
             Found:
             LoginPresenter<V>
           */
           loginUserModel.onAttach(this)
    }

}

Login Model

class LoginUserModel<P: ILoginPresenter<ILoginView>> : LoginModelContract<P> {
     var iLoginPresenter : P? = null
     override fun onAttach(ILoginPresenter: P) {
        iLoginPresenter = ILoginPresenter
    }
}

LoginModelContract

public interface LoginModelContract<P: ILoginPresenter<ILoginView>> {
  fun getUsersList(
    userName:String,
    guid: String
  )

  fun onAttach(ILoginPresenter: P)
  fun onDetatch()
  fun getPresenter(): P?

}

You can use two generic statements like below

class LoginUserModel<V: ILoginView, P : ILoginPresenter<V>> : LoginModelContract<V,P> {

    var iLoginPresenter : P? = null
    
    override fun onAttach(ILoginPresenter: P) {
        iLoginPresenter = ILoginPresenter
    }
}

interface ILoginView{

}

interface ILoginPresenter<T>{
    fun setupModel()
}

class LoginPresenter<V : ILoginView>:  ILoginPresenter<V> {
    lateinit var loginUserModel: LoginUserModel<V,ILoginPresenter<V>>
    lateinit var iLoginPresenter: ILoginPresenter<V>

    override fun setupModel() {
        iLoginPresenter = this
        loginUserModel = LoginUserModel()
        loginUserModel.onAttach(this)
    }

}

public interface LoginModelContract<V: ILoginView, P : ILoginPresenter<V>> {
    fun onAttach(ILoginPresenter: P)
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM