亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法從 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                    }                }            })    }}很好,它工作正?!,F在我需要從 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 關注
  • 219 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號