繁体   English   中英

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

[英]Can't call Kotlin's extension property from java

Android Studio 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文件中调用extension属性( 目前暂时无法将其转换为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()'

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

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:这与扩展功能非常相似。 它们也被编译成静态方法,但是名称通常不会改变。

反编译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);
        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM