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的子類。這裡只能說明模組之間的方法呼叫是沒有多型性,它找不到繼承關係,要解決這個問題只能使用方法的過載.
相關文章
- c++中的繼承關係C++繼承
- ArrayList繼承關係分析繼承
- 關於Java中的物件、類、抽象類、介面、繼承之間的聯絡Java物件抽象繼承
- 聊聊TypeScript中類、介面之間相互繼承與實現的那些事兒TypeScript繼承
- 繼承關係和魔術方法繼承
- 5. JPA物件繼承關係物件繼承
- Flutter 吐血整理元件繼承關係圖Flutter元件繼承
- Java面試題:Java中的集合及其繼承關係Java面試題繼承
- Linux中終端介面與圖形介面之間的切換關係Linux
- java繼承關係下執行順序Java繼承
- C++ exception 異常類繼承關係C++Exception繼承
- 介面、抽象類、普通類之間的關係抽象
- Android開發中Gradle外掛,Gradle版本與JDK版本之間的對應關係 AndroidAndroidGradleJDK
- #JAVA#物件導向(繼承中成員方法的關係)Java物件繼承
- TypeScript 介面繼承TypeScript繼承
- Flutter深入淺出元件篇---繼承關係圖Flutter元件繼承
- C++標準庫中檔案流類的繼承關係C++繼承
- TypeScript 介面繼承類TypeScript繼承
- 深入Spring Boot:ClassLoader的繼承關係和影響Spring Boot繼承
- JAVA類的頂層Type抽象和繼承關係Java抽象繼承
- IntelliJ IDEA 中uml外掛檢視某類的所有繼承或實現關係 + outline功能IntelliJIdea繼承
- JS中繼承的實現JS中繼繼承
- 深刻理解php“繼承“、“私有屬性“、“$this指向“的關係PHP繼承
- Java 自學 - 介面與繼承 介面Java繼承
- 繼承(extends)與介面( implements)繼承
- javascript之繼承JavaScript繼承
- js之繼承JS繼承
- python之繼承Python繼承
- 介面是否可繼承(extends)介面? 抽象類是否可實現 (implements)介面? 抽象類是否可繼承具體類(concrete class)?繼承抽象
- 繼承關係裡的六個預設成員函式繼承函式
- 為什麼更推薦使用組合而非繼承關係?繼承
- python 基礎之繼承、重寫、多繼承Python繼承
- TLS與SSL之間關係TLS
- 【java】類之間的關係Java
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- 類的繼承,介面的使用繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- JavaScript(2)之——繼承JavaScript繼承