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

安卓工作室 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()'


POPMUISE
浏览 181回答 2
2回答

浮云间

Kotlin 将扩展属性编译成静态方法。String这是一个在名为 的文件中扩展类的示例StringUtils.kt:val String.greeting&nbsp; get() = "hello $this"所以一个非常简单的方法,当在 kotlin 中调用时"fred".greeting会返回hello fred。如果检查 kotlin 字节码并在 IDE 中对其进行反编译,可以看到结果类似于:public final class StringUtilsKt {&nbsp;@NotNull&nbsp;public static final String getGreeting(@NotNull String $this$greeting) {&nbsp; Intrinsics.checkParameterIsNotNull($this$greeting, "$this$greeting");&nbsp; return "hello " + $this$greeting;&nbsp;}}类中的静态方法StringUtilsKt。这意味着您可以简单地从 java 中调用它StringUtilsKt.getGreeting("fred"),它会产生相同的输出。PS:这与扩展功能非常相似。它们也被编译成静态方法,但名称通常不会改变。

一只斗牛犬

在反编译 Kotlin 的字节码后,我得到了这个:&nbsp; &nbsp;@NotNull&nbsp; &nbsp;public final ErrorResponse getErrorResponse(@NotNull Response $this$errorResponse) {&nbsp; &nbsp; &nbsp; Intrinsics.checkParameterIsNotNull($this$errorResponse, "$this$errorResponse");&nbsp; &nbsp; &nbsp; ErrorResponse var10000 = ErrorUtils.parseError($this$errorResponse);&nbsp; &nbsp; &nbsp; Intrinsics.checkExpressionValueIsNotNull(var10000, "ErrorUtils.parseError(this)");&nbsp; &nbsp; &nbsp; return var10000;&nbsp; &nbsp;}所以从 Java 我可以这样调用:@Override&nbsp; &nbsp; public void onTangoResponse(@NotNull Response<?> response) {&nbsp; &nbsp; &nbsp; &nbsp; boolean isSuccessful = response.isSuccessful();&nbsp; &nbsp; &nbsp; &nbsp; if (isSuccessful) { // code >= 200 && code < 300;&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ErrorResponse errorResponse = getErrorResponse(response);&nbsp; &nbsp; &nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java