将java类文件转换为kotlin会导致编译错误

我有一个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. 

就我所知,你的代码有两个问题。

首先,Kotlin不允许使用lambda来实现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!!) } } })) 

如果您更喜欢使用lambda表达式,则可以以不同的方式声明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>]错误信息的前半部分inferred type is (???, ???) -> [ERROR :<ERROR FUNCTION RETURN TYPE>] 。 这基本上是类型推断失败。 对callBack的调用看起来不像CallbackWrapper所暗示的CallBack接口,我认为这可能与它有关。

编辑:

用更简洁的解决方案为您的改装问题添加了一个答案。