为了账号安全,请及时绑定邮箱和手机立即绑定

无法从 Java 调用 Kotlin 的扩展属性

无法从 Java 调用 Kotlin 的扩展属性

POPMUISE 2023-03-31 09:51:50
安卓工作室 3.4这是我的科特林课程:open class DefaultRestClientCallback<T> : Callback<T> {    val Response<*>.errorResponse: ErrorResponse        get() = ErrorUtils.parseError(this)    override fun onResponse(call: Call<T>, response: Response<T>) {正如你在这里看到的,我有属性扩展:errorResponse在另一个 Kotlin 类 (Test.kt) 中,我这样称呼它:class Test {    fun test() {        TransportService.login("email",            "pass", object : DefaultRestClientCallback<JsonElement>() {                override fun onTangoResponse(response: Response<*>) {                    val isSuccessful = response.isSuccessful                    if (isSuccessful) { // code >= 200 && code < 300;                    } else {                        val errorResponse = response.errorResponse                    }                }            })    }}很好,它工作正常。现在我需要从 java 文件调用扩展属性(我现在无法将其转换为 Kotlin)。我试试这个:TransportService.login("email", "pass", new DefaultRestClientCallback<JsonElement>() {    @Override    public void onTangoResponse(@NotNull Response<?> response) {        boolean isSuccessful = response.isSuccessful();        if (isSuccessful) { // code >= 200 && code < 300;        } else {            ErrorResponse errorResponse = response.errorResponse();        }    }});}但是我在这一行中遇到编译错误: ErrorResponse errorResponse = response.errorResponse();错误:Cannot resolve method 'errorResponse()'
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

Kotlin 将扩展属性编译成静态方法。String这是一个在名为 的文件中扩展类的示例StringUtils.kt:


val String.greeting

  get() = "hello $this"

所以一个非常简单的方法,当在 kotlin 中调用时"fred".greeting会返回hello fred。


如果检查 kotlin 字节码并在 IDE 中对其进行反编译,可以看到结果类似于:


public final class StringUtilsKt {

 @NotNull

 public static final String getGreeting(@NotNull String $this$greeting) {

  Intrinsics.checkParameterIsNotNull($this$greeting, "$this$greeting");

  return "hello " + $this$greeting;

 }

}

类中的静态方法StringUtilsKt。这意味着您可以简单地从 java 中调用它StringUtilsKt.getGreeting("fred"),它会产生相同的输出。


PS:这与扩展功能非常相似。它们也被编译成静态方法,但名称通常不会改变。


查看完整回答
反对 回复 2023-03-31
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

在反编译 Kotlin 的字节码后,我得到了这个:


   @NotNull

   public final ErrorResponse getErrorResponse(@NotNull Response $this$errorResponse) {

      Intrinsics.checkParameterIsNotNull($this$errorResponse, "$this$errorResponse");

      ErrorResponse var10000 = ErrorUtils.parseError($this$errorResponse);

      Intrinsics.checkExpressionValueIsNotNull(var10000, "ErrorUtils.parseError(this)");

      return var10000;

   }

所以从 Java 我可以这样调用:


@Override

    public void onTangoResponse(@NotNull Response<?> response) {

        boolean isSuccessful = response.isSuccessful();

        if (isSuccessful) { // code >= 200 && code < 300;

        } else {

            ErrorResponse errorResponse = getErrorResponse(response);

        }

}


查看完整回答
反对 回复 2023-03-31
  • 2 回答
  • 0 关注
  • 180 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信