美文网首页
Android中Module之间接口调用发现不了继承关系

Android中Module之间接口调用发现不了继承关系

作者: e小e | 来源:发表于2018-08-05 12:01 被阅读165次

    最近发现一个奇怪的问题,特此记录一下,为了场景重现我写了一个比较简单Demo:
    有两个Module,并且都只有一个类
    Module1:

    public class ModuleOneEntrance {
        public ModuleOneEntrance() {
        }
    
        public static void init(FragmentActivity fragmentActivity) {
            ModuleTwoEntrance.init(fragmentActivity);
            System.out.print("module one init");
        }
    }
    

    Module2:

    public class ModuleTwoEntrance {
        public ModuleTwoEntrance() {
        }
    
        public static void init(Activity activity) {
            System.out.print("module two init from " + activity.getComponentName());
        }
    }
    

    可以看出来Module1依赖于Module2的init,但是参数对象是继承关系,按照道理说这样写应该没有什么问题,但是在模块之间这样写就会出现方法签名找不到. 我们继续来看看主工程的调用


    image.png
    image.png
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ModuleOneEntrance.init(this);
        }
    }
    

    主工程很简单,直接就是ModuleOneEntrance.init(this),接下来运行就会报

    08-05 11:37:48.711 8357-8357/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                     Process: com.example.huangli.moduledepdemo3, PID: 8357
                                                     java.lang.NoSuchMethodError: No static method init(Landroid/support/v4/app/FragmentActivity;)V in class Lcom/example/module2/ModuleTwoEntrance; or its super classes (declaration of 'com.example.module2.ModuleTwoEntrance' appears in /data/app/com.example.huangli.moduledepdemo3-1/split_lib_dependencies_apk.apk)
                                                         at com.example.module1.ModuleOneEntrance.init(ModuleOneEntrance.java:15)
                                                         at com.example.huangli.moduledepdemo3.MainActivity.onCreate(MainActivity.java:14)
                                                         at android.app.Activity.performCreate(Activity.java:6237)
                                                         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                         at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                         at android.os.Handler.dispatchMessage(Handler.java:102)
                                                         at android.os.Looper.loop(Looper.java:148)
                                                         at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    

    这错误的意思很明确说是在ModuleTwoEntrance里面找不到init(FragmentActivity fragmentActivity),但是ModuleTwoEntrance明明有init(Activity activity)方法,FragmentActivity是Activity的子类。这里只能说明模块之间的方法调用是没有多态性,它找不到继承关系,要解决这个问题只能使用方法的重载.

    相关文章

      网友评论

          本文标题:Android中Module之间接口调用发现不了继承关系

          本文链接:https://www.haomeiwen.com/subject/zwcbvftx.html