Android中Module之間介面呼叫發現不了繼承關係
最近發現一個奇怪的問題,特此記錄一下,為了場景重現我寫了一個比較簡單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,但是引數物件是繼承關係,按照道理說這樣寫應該沒有什麼問題,但是在模組之間這樣寫就會出現方法簽名找不到. 我們繼續來看看主工程的呼叫
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的子類。這裡只能說明模組之間的方法呼叫是沒有多型性,它找不到繼承關係,要解決這個問題只能使用方法的過載.
相關文章
- Java介面之間的繼承Java繼承
- c++中的繼承關係C++繼承
- PHP中類的繼承關係PHP繼承
- 關於Java中的物件、類、抽象類、介面、繼承之間的聯絡Java物件抽象繼承
- ArrayList繼承關係分析繼承
- 聊聊TypeScript中類、介面之間相互繼承與實現的那些事兒TypeScript繼承
- Qt類繼承關係圖QT繼承
- 解惑《你必須知道的.net》——C#繼承關係中【方發表】的建立和呼叫C#繼承
- 許可權管理中角色間的繼承關係有沒有必要?繼承
- angular中$scope作用域和繼承關係解析Angular繼承
- 5. JPA物件繼承關係物件繼承
- 繼承關係和魔術方法繼承
- Android View 可視控制元件的繼承關係AndroidView控制元件繼承
- Java面試題:Java中的集合及其繼承關係Java面試題繼承
- 公有繼承、私有繼承和保護繼承之間的對比繼承
- Flutter 吐血整理元件繼承關係圖Flutter元件繼承
- hibernate 繼承對映關係( JOINED)繼承
- Android 中Activity,Window和View之間的關係AndroidView
- java繼承關係下執行順序Java繼承
- #JAVA#物件導向(繼承中成員方法的關係)Java物件繼承
- TypeScript 介面繼承TypeScript繼承
- 介面、抽象類、普通類之間的關係抽象
- Linux中終端介面與圖形介面之間的切換關係Linux
- UML中類之間的關係
- Flutter深入淺出元件篇---繼承關係圖Flutter元件繼承
- TypeScript 介面繼承類TypeScript繼承
- Java繼承和介面Java繼承
- 繼承與介面 (轉)繼承
- Effective c++(筆記)之繼承關係與物件導向設計C++筆記繼承物件
- Java 自學 - 介面與繼承 介面Java繼承
- JS中繼承的實現JS中繼繼承
- QT中類之間的關係圖QT
- JAVA類的頂層Type抽象和繼承關係Java抽象繼承
- hibernate 繼承對映關係( SINGLE_TABLE)繼承
- hibernate 繼承對映關係( TABLE_PER_CLASS)繼承
- 繼承對映關係 TPH、TPT、TPC<EntityFramework6.0>繼承Framework
- C++繼承一之公有繼承C++繼承
- 繼承中引數傳遞及呼叫順序繼承