我有一个java类文件可以正常工作,但如果我将它转换为Kotlin则会产生一些问题。这是一个Java版本
public class CallbackWrapper<T> implements Callback<T> {
private Wrapper<T> wrapper;
public CallbackWrapper(Wrapper<T> wrapper) {
this.wrapper = wrapper;
}
public void onFailure(Call<T> call, Throwable t) {
wrapper.onResult(t, null);
}
public void onResponse(Call<T> call, Response<T> response) {
wrapper.onResult(null, response);
}
public interface Wrapper<T> {
void onResult(@Nullable Throwable t, @Nullable Response<T> response);
}
}
这就是我如何使用这个课程没有任何问题......
request.enqueue(CallbackWrapper<RegisterResponse> { throwable, response ->
response?.let { callBack.onResponse(response.body() ?: RegisterResponse()) }
throwable?.let { callBack.onFailed(throwable.message!!) }
})
这是转换后的Kotlin版本
class CallbackWrapper<T>(private val wrapper: CallbackWrapper.Wrapper<T>) : Callback<T> {
override fun onFailure(call: Call<T>, t: Throwable) {
wrapper.onResult(t, null)
}
override fun onResponse(call: Call<T>, response: Response<T>) {
wrapper.onResult(null, response)
}
interface Wrapper<T> {
fun onResult(t: Throwable?, response: Response<T>?)
}
}
问题是在将它转换为Kotlin之后,我正在使用这个类的代码块无效。我不明白它们之间有什么区别。
这是编译错误日志
Error:(17, 63) Type mismatch: inferred type is (???, ???) -> [ERROR :<ERROR FUNCTION RETURN TYPE>] but CallbackWrapper.Wrapper<RegisterResponse> was expected
Error:(17, 65) Cannot infer a type for this parameter. Please specify it explicitly.
Error:(17, 76) Cannot infer a type for this parameter. Please specify it explicitly.
答案 0 :(得分:3)
据我所知,您的代码存在两个问题。
首先,Kotlin不允许使用lambdas来实现Kotlin功能接口,因此你的lambda不会起作用(它确实允许实现Java功能接口,因为Java没有适当的函数类型)。因此,要不更改代码,您需要使用对象表示法:
request.enqueue(CallbackWrapper<RegisterResponse>(object : CallbackWrapper.Wrapper<RegisterResponse> {
override fun onResult(throwable: Throwable?, response: Response<RegisterResponse>?) {
response?.let { callBack.onResponse(response.body() ?: RegisterResponse()) }
throwable?.let { callBack.onFailure(throwable.message!!) }
}
}))
如果您更喜欢使用lambdas,则可以以不同方式声明CallbackWrapper
类:
typealias Wrapper<T> = (t: Throwable?, response: Response<T>?) -> Unit
class OtherCallbackWrapper<T>(val wrapper: Wrapper<T>) : Callback<T> {
override fun onFailure(call: Call<T>, t: Throwable) = wrapper.invoke(t, null)
override fun onResponse(call: Call<T>, response: Response<T>) = wrapper.invoke(null, response)
}
这就是but CallbackWrapper.Wrapper<RegisterResponse> was expected
部分的照顾。
但这仍然无效,这使我们知道错误消息的前半部分是inferred type is (???, ???) -> [ERROR :<ERROR FUNCTION RETURN TYPE>]
。这基本上是类型推断失败。对callBack
的调用似乎与CallbackWrapper隐含的CallBack
接口不匹配,我希望这可能与它有关。
编辑:
使用更简洁的解决方案为您的Retrofit问题添加了答案。