将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
部分照顾。
但是这仍然不起作用,这使得我们inferred type is (???, ???) -> [ERROR :
错误信息的前半部分inferred type is (???, ???) -> [ERROR :
。 这基本上是types推断失败。 对callBack
的调用看起来不像CallbackWrapper所暗示的CallBack
接口,我认为这可能与它有关。
编辑:
用更简洁的解决方案为您的改装问题添加了一个答案。
- jackson自定义序列化程序或值对象?
- 在Kotlin中使用@ EnableNeo4jRepositories(basePackageClasses =“myApp”)
- Gradle不会导入bintray依赖项,但不会引发任何错误
- 为什么Kotlin收到这样的UndeclaredThrowableException而不是ParseException?
- Kotlin kotlinClass.class.getName()不能返回包名,而只能返回简单的类名
- 如何在Android Activity上使用Kotlin扩展函数进行空检查
- Spring 5和Kotlin 1.1协程:类型rx.Scheduler不存在
- BoundedPriorityBlockingQueue – 线程安全,阻塞和有界?
- 使用Kotlin的数字操作是否像Java原语一样快?