Kotlin無法呼叫到Java中定義的interface類的問題記錄
阿新 • • 發佈:2018-11-28
問題產生原因概述
一個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