1. 程式人生 > >Kotlin無法呼叫到Java中定義的interface類的問題記錄

Kotlin無法呼叫到Java中定義的interface類的問題記錄

問題產生原因概述

一個kotlin類,呼叫一個Java類中的一個方法。引發了下面這個錯誤。

因為我在kotlin中呼叫了了java程式碼中定義的一個介面,然後就報錯一個IllegalAccessError錯誤。如下:

 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: test.juyoufuli.com.myapplication, PID: 19866
    java.lang.IllegalAccessError: Interface test.juyoufuli.com.myapplication.app.
view.LabelsView
$MyChildClickListener implemented by class test.juyoufuli.com.myapplication.mvp.ui.searchview.SearchViewActivity$onResume$1 is inaccessible (declaration of 'test.juyoufuli.com.myapplication.mvp.ui.searchview.SearchViewActivity$onResume$1' appears in /data/app/test.juyoufuli.com.
myapplication-wPuFy3wI4m1ZSX5n23LKjw==/base.apk) at java.lang.Class.newInstance(Native Method) at android.app.Instrumentation.newActivity(Instrumentation.java:1173) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2708) at android.app.ActivityThread.
handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

上述錯誤主要是說無法到達(inaccessible)該方法。google了一把,確實有人遇到這種問題,下面介紹解決問題方案。

介紹一下各個地方的code

 //我在這裡呼叫我定義的方法 (這個方法運營後觸發點選事件,直接報錯)
 lbvSearch!!.setChildClickListener { view, string, position ->
            searchHotWord(string)
        }
//這麼呼叫也可以(這個直接就報錯,完全無法執行。提示如下圖)
 lbvSearch.setChildClickListener(object : LabelsView.ChildClickListener() {
            fun onChildClick(view: View, `object`: Any, position: Int) {
                searchHotWord(string)
            }
        })
 //常規的一個點選的介面
       interface MyChildClickListener {
        /**
         * @param view
         * @param string
         * @param position
         * @return
         */
        void onChildClick(View view, String string, int position);
    }

在這裡插入圖片描述
就是以上一個很常規的呼叫,但是實際卻不能執行。上圖的提示也說的比較清楚不能使用MyChildClickListener方法。為什麼不能使用呢?

這裡聯想到以前的一個問題。

在kotlin中使用butterknife的經歷(雖然kotlin提供了自己的註解庫),如下對比一下。

 //java中使用
 @BindView(R.id.ll_cash_tab)
 LinearLayout llCashTab;
 //kotlin中使用,需要新增一個新的註解,註解的意思就說設定這個引數為public的
  @JvmField// * Instructs the Kotlin compiler not to generate getters/setters for this property and expose it as a field.
  @BindView(R.id.et_search_word)
  internal var etSearchWord: EditText? = null

說了這麼多是不是突然明白了什麼?

其實就說我們的Java中預設的方法和變數預設是protected的修飾,但是kotlin中卻無法呼叫protected修飾的方法。

沒錯,你只需要在interface前面加上public的修飾符就好了


說了一大堆就為了這一個修飾符,因為對kotlin中的特性瞭解不充分導致。後續持續中會不斷總結記錄。

你的鼓勵,是我前進的動力。

this all