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

我有一个Java类文件工作正常,但如果我将它转换为Kotlin它会造成一些问题。 这是一个Java版本

public class CallbackWrapper implements Callback { private Wrapper wrapper; public CallbackWrapper(Wrapper wrapper) { this.wrapper = wrapper; } public void onFailure(Call call, Throwable t) { wrapper.onResult(t, null); } public void onResponse(Call call, Response response) { wrapper.onResult(null, response); } public interface Wrapper { void onResult(@Nullable Throwable t, @Nullable Response response); } } 

这就是我如何使用这个类没有任何问题…

 request.enqueue(CallbackWrapper { throwable, response -> response?.let { callBack.onResponse(response.body() ?: RegisterResponse()) } throwable?.let { callBack.onFailed(throwable.message!!) } }) 

这里是转换后的Kotlin版本

 class CallbackWrapper(private val wrapper: CallbackWrapper.Wrapper) : Callback { override fun onFailure(call: Call, t: Throwable) { wrapper.onResult(t, null) } override fun onResponse(call: Call, response: Response) { wrapper.onResult(null, response) } interface Wrapper { fun onResult(t: Throwable?, response: Response?) } } 

问题是,转换成Kotlin后,我使用这个类的代码块没有工作。 我不明白他们之间有什么区别。

这里是编译错误日志

 Error:(17, 63) Type mismatch: inferred type is (???, ???) -> [ERROR :] but CallbackWrapper.Wrapper 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没有适当的函数types)。 所以要调用代码不变,你需要使用对象符号:

 request.enqueue(CallbackWrapper(object : CallbackWrapper.Wrapper { override fun onResult(throwable: Throwable?, response: Response?) { response?.let { callBack.onResponse(response.body() ?: RegisterResponse()) } throwable?.let { callBack.onFailure(throwable.message!!) } } })) 

如果您更喜欢使用lambdaexpression式,则可以以不同的方式声明CallbackWrapper类:

 typealias Wrapper = (t: Throwable?, response: Response?) -> Unit class OtherCallbackWrapper(val wrapper: Wrapper) : Callback { override fun onFailure(call: Call, t: Throwable) = wrapper.invoke(t, null) override fun onResponse(call: Call, response: Response) = wrapper.invoke(null, response) } 

所以这是but CallbackWrapper.Wrapper was expected部分照顾。

但是这仍然不起作用,这使得我们inferred type is (???, ???) -> [ERROR :]错误信息的前半部分inferred type is (???, ???) -> [ERROR :] 。 这基本上是types推断失败。 对callBack的调用看起来不像CallbackWrapper所暗示的CallBack接口,我认为这可能与它有关。

编辑:

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