【问题标题】:how to pass generic class implementing generic interface to another generic class Kotlin如何将实现泛型接口的泛型类传递给另一个泛型类 Kotlin
【发布时间】:2021-05-05 16:26:17
【问题描述】:

您好,我是编程新手,我尝试通过将通用 Presenter 类 LoginPresenter 传递给通用模型类 LoginUserModel 来实现 MVP 模式,但出现类型不匹配错误。 在loginUserModel.onAttach(this) 而且我无法弄清楚如何将通用接口传递给另一个类。

登录演示者

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)
    }

}

登录模式

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?

}

【问题讨论】:

    标签: kotlin generics mvp


    【解决方案1】:

    您可以使用如下两个通用语句

    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)
    }
    

    【讨论】:

    • 我已经用错误修复更新了答案
    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多