当前位置: 首页 > 知识库问答 >
问题:

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

蓬琦
2023-03-14
 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!!) }
 })
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.

共有1个答案

曹疏珂
2023-03-14

据我所知,您的代码有两个问题。

首先,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!!) }
        }
    }))

如果您喜欢使用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)
}
 类似资料:
  • 我正在Android Studio将一个Java Android项目转换为Kotlin,但我遇到了一些问题。

  • 我是Android Studio的初学者,我希望主要活动是在java上而不是在kotlin上。我测试了一些可用的堆栈溢出解决方案,例如: Menu->Tools->Kotlin->将kotlin反编译到java 菜单>工具>Kotlin>显示Kotlin字节码 单击“反编译”按钮 复制java代码 并且总是禁用“反编译”按钮。

  • 有谁能帮我把Android Studio中的Kotlin代码转换成Java吗? 我经历了以下过程: 工具>>Kotlin>>将Kotlin反编译为Java

  • 问题内容: 我有一个Kotlin源文件,但我想将其转换为Java。 如何将Kotlin转换为Java源代码? 问题答案: 正如@Vadzim所说,在IntelliJ或Android Studio中,你只需执行以下操作即可从kotlin获取Java代码: Menu > Tools > Kotlin > Show Kotlin Bytecode 点击Decompile按钮 复制Java代码 更新: 使

  • 我已经开始为一个个人项目学习JavaFX,事情进展顺利,直到我遇到了创建一组文本字段的问题。据我所知,代码是正确的,我使用的IDE没有给出任何错误指示。但当我尝试运行程序时,它会抛出一长串错误,这些错误在我注释创建文本字段的代码时不会发生。当这些代码行被省略时,程序将完全按照它应该的方式运行。 我正在使用InteliJ Idea,Windows 10,Javafx SDK 14.0.1和Java

  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • 我在编译顺序时遇到编译器错误。java文件,即使它包含另一个打包类的导入语句。我不完全确定为什么会发生这种情况,但这是一个目录树,其中包含一些文件: > com/my/domain/Order.java 这个文件里面有下面的包和导入: com/my/utils/MyDate。此文件中包含以下包和导入: 编译顺序时出现编译器错误。java: 我仍然不知道如何解决这个问题后,试图从评论。这里有一些更多

  • 问题内容: 我在项目中创建了一个工厂类,从理论上讲,该类允许我为任何(受支持的)给定类型创建管理器。与管理器进行交互使我可以更改给定类型的某些属性。我面临的问题是,当我尝试为泛型类型创建管理器时,编译器粉碎了我的希望和梦想。 以下代码是我正在使用的简化版本。我尝试创建“ test3Manager”的行将不会编译,并且我试图了解为什么会这样。它下面的线显示了一种“解决方法”,我正试图避免这种情况。