Android通用参数

时间:2018-07-25 14:50:03

标签: android generics kotlin rx-java2

大家好,我在传递参数时遇到了一些问题。我有2个API调用,如果设备没有互联网连接,我需要将调用传递回另一个类 因为每个api都有不同的pojo,所以android会警告我类型不匹配。这是我的代码

 override fun initRetrofitCarList(call: Observable<Response<MyCarModel>>) {
    compositeDisposable.add(call
            .map{
              it.body()
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                if (it.status == Constants.Result.SUCCESS) {
                    mPresenter.successGetVehicleList(it.vehicle, "api")
                } else {
                    mPresenter.failedGetVehicleList(it.message)
                }
            }, {
                mPresenter.onNoConnection(call) <- this here will give WARNING because of mismatch type
            }))
}

override fun initRetrofitBikeList(call: Observable<Response<MyBikeModel>>) {
    compositeDisposable.add(call
             .map{
              it.body()
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                if (it.status == Constants.Result.SUCCESS) {
                    mPresenter.successGetVehicleList(it.vehicle, "api")
                } else {
                    mPresenter.failedGetVehicleList(it.message)
                }
            }, {
                mPresenter.onNoConnection(call) <- this here will give WARNING because of mismatch type
            }))
}

如何使函数的参数进行通用调用?

编辑

 override fun onNoConnection(//need to be generic) {
    mView.dismissProgressDialog()
    mView.showRetryDialog(call)
}

2 个答案:

答案 0 :(得分:4)

只需在函数名称前加上T即可声明该函数将接收通用代码, showRetryDialog函数也必须是通用的,否则检查实例和类型转换是否通用为预期的类型

override  fun <T> onNoConnection(call :Observable<Response<T>>){
mView.dismissProgressDialog()
mView.showRetryDialog(call)
}

答案 1 :(得分:1)

好吧,您在两种方法上的调用定义不同:

·在initRetrofitCarList()中,呼叫是Observable<Response<MyCarModel>>

·在initRetrofitBikeList()中,呼叫是Observable<Response<MyBikeModel>>

因此,当您将此调用传递给另一个函数时,您需要请求通用Observable<Response<T>>作为参数。