java - 将java类文件转换为kotlin会出现编译错误

标签 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 函数式接口(interface),因此您的 lambda 无法工作(它确实允许实现 Java 函数式接口(interface),因为 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!!) }
        }
    }))

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

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似乎不太匹配 CallBack CallbackWrapper 隐含的接口(interface),我希望这可能与它有关。

编辑:

使用更简洁的解决方案添加了您的 Retrofit 问题的答案。

关于java - 将java类文件转换为kotlin会出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43235423/

相关文章:

java - Spring MVC 项目中的 Hibernate Validator

java - 在 Android Studio Java 中读取数据库标题并显示在 ListView 中

android - 应用程序无法到达附近的地方

android - 为什么连接到 mediaBrowser 时不调用 connectionCallback.onConnected()?

kotlin - Kotlin 挂起功能是否在单独的线程上运行?

java - JAVA中使用JNA时内存访问无效

java - Java 中的 AES 加密与 PHP 不同

java - 阵列的频率分布

java - Android - 具有固定半径(以米为单位)的 Google Maps API 热图

javascript - 在 Kotlin 中访问数组的出界元素