Kotlin无法调用到Java中定义的interface类的问题记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shayubuhuifei/article/details/84320829

问题产生原因概述

一个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

猜你喜欢

转载自blog.csdn.net/shayubuhuifei/article/details/84320829
今日推荐