与 Android 项目中的源库相比,实现 AAR 库的意外结果。
super关键字似乎指向祖父类而不是直接父类。
即使在父级中声明并覆盖了相同的方法,也以某种方式覆盖了祖父级方法。
这两个问题仅在使用库的编译 AAR 时存在,即使用库源代码实现相同项目时不存在问题。
我希望这两个调用都能super解析为父类。
我希望覆盖onCreate覆盖父类而不是祖父类中的方法。
我有一个基于包的 Android 应用程序com.example.sourceapp
这使用和管理位于 中的单独库的源代码,com.example.sourcelibrary我们将在其中调用一个类ParentClass。
在ParentClass我有两个感兴趣的成员。
一个名为的公共布尔值myBool,起源于ParentClass
覆盖该android.app.Activity.onCreate方法的方法,该方法也被GrandparentClass其他库中的某个祖父类覆盖和继承com.example.someotherlibrary。
在我的com.example.sourceapp.MainActivity我做两件事。
我扩展com.example.sourcelibrary.ParentClass和修改myBool包含在ParentClassusing 中super.myBool = true;。
我在被覆盖的方法中调用onCreatevia 。super.onCreate()两者都按预期工作。当我将鼠标悬停在super.onCreateAndroid Studio 上时,表明它可以按预期正确解析为父类。
在不同的 Android 项目中,我依赖于由同一个库生成的已编译(调试)AAR 文件,com.example.compiledapp.MainActivity而不是依赖于源库。com.example.sourcelibrary
我从顶部的 AAR 包中导入所需的类,com.example.compiledapp.MainActivity没有import com.example.sourcelibrary.ParentClass任何解决问题。
稍后com.example.compiledapp.MainActivity我使用与以前相同的代码
super.myBool = true; super.onCreate()
但 Android Studio 表示它无法解析 myBool 中的super.myBool = true;.
此外,第二行似乎解决得很好,但是当我将鼠标悬停在它上面时仔细检查,Android Studio 表明它onCreate解析为祖父类的成员com.example.someotherlibrary.GrandparentClass而不是父类com.example.sourcelibrary.ParentClass。
查看几行,当我将鼠标悬停在onCreate覆盖上时,Android Studio 表明我正在覆盖onCreate祖父类,而不是父类。
为什么/如何onCreate跳过父方法并覆盖祖父类?
此外,看起来super关键字正在解析为祖父类而不是父类。这是我能想到的唯一解释,它会导致onCreate解析为 GrandparentClass 而myBool无法解析。我不认为这是如何super工作的。
这是正常的吗?我只是误解了继承的基本原理吗?也许我在编译到 AAR 时做错了,以至于尽管被声明为公共的父变量/方法变得不可访问?或者,Android Studio 可能会根据我不知道的一些规则优先选择一个包而不是另一个包?
人到中年有点甜
相关分类