如何正确处理泛型类型?

时间:2019-03-02 03:05:12

标签: kotlin

我正在尝试创建一个自定义函数来处理我所有的API响应,但是我不知道如何正确处理它。

这是我的代码

我的自定义回调

interface ResponseCallback<T> {
    fun onSuccess(response: T)
    fun onError(code: Int, message: String)
}

这就是我调用请求API的方式

createRequest(getLogin(id), object : API.ResponseCallback<LoginResponse>{
    override fun onError(code: Int, message: String) {
    }

    override fun onSuccess(response: LoginResponse) {
    }
})

这就是我处理请求的方式

fun createRequest(source: Observable<*>, callback: ResponseCallback<*>) {
    disposable.add(
        source.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                { it ->
                    //
                    // callback.onSuccess(it)

                },
                {

                }
            )
    )
}

但是我的问题是,callback.onSuccess()参数是Nothing,不能接受callback.onSuccess(it)

请帮助我,谢谢。

1 个答案:

答案 0 :(得分:1)

如果您不知道泛型的特定类型参数,则仅应使用star projections。使用它们时,编译器将防止您使用参数化类型执行不安全的操作。例如,您已经看到无法将任何参数传递给createRequest,因为您实际上已经告诉编译器您不知道其类型应该是什么。

然后的解决方法是给您的Observable函数一个类型参数,并使fun <T> createRequest(source: Observable<T>, callback: ResponseCallback<T>) { ... callback.onSuccess(it) // works, since you're passing in a T to a method that requires a T ... } 属于该类型,以及使您希望调用的回调:

<select>
    <option>test</option>
    <option>testing it</option>
    <option>bla bla bla</option>
</select>