【问题标题】:Inherited public method from separate package not resolvable while directly defined public method resolves从单独的包继承的公共方法无法解析,而直接定义的公共方法解析
【发布时间】:2020-08-12 07:26:45
【问题描述】:

问题

正如下面伪代码中所定义的,为什么在单独的包 (packageB) 中定义的父类 (MyCustomClassA) 的继承的公共方法 (setContentView) 尽管直接定义了公共方法却无法解析在上述父类 (myPublicMethod) 中解决了吗?

由于myPublicMethodsetContentView 都是公共方法,我很困惑为什么一个能够解决而另一个不能。

最小示例伪代码

下面的伪代码中显示了层次结构的摘要以及描述 Android Studio 显示的工具提示和错误的 cmets:

package packageA;

public abstract class BaseClass extends Activity{
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState)
        setContentView(layoutID); // Tooltip shows inheritance from android.app.Activity public void setContentView(@LayoutRes int layoutResID)
    }
}

package packageB;

import packageA.BaseClass

public abstract class MyCustomClassA extends BaseClass{
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState)
        setContentView(layoutID); // Tooltip shows inheritance from android.app.Activity public void setContentView(@LayoutRes int layoutResID)
    }

}

package packageB;

import packageB.MyCustomClassA

public abstract class MyCustomClassB extends MyCustomClassA{
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState)
        setContentView(layoutID); // Tooltip shows inheritance from android.app.Activity public void setContentView(@LayoutRes int layoutResID)
        myPublicMethod(); // Tooltip shows this resolves to packageB.MyCustomClassA
    }
    public void myPublicMethod() {
    }
}

package packageC;

import packageB.MyCustomClassA

public abstract class MyCustomClassC extends MyCustomClassA{
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState)
        setContentView(layoutID); // Error: Cannot resolve method 'setContentView' in MyCustomClassC
        myPublicMethod(); // Tooltip shows this resolves to packageB.MyCustomClassA
    }
}

到目前为止我尝试了什么:

  1. 使用 Android Studio,我 Ctrl+单击父类并验证它们是否都指向正确的类。
  2. I Build -> Clean Project and Invalidate Caches and Restart 以确保缓存中没有任何内容过时。
  3. 我创建了一个虚拟类MyCustomClassB 来测试setContentView 方法是否可以在同一个包中解析。它确实解决了。这让我认为这可能是一个包/受保护或其他访问问题,但由于 setContentView 是 Activity 中的公共方法,我无法获得其他故障排除想法。
  4. 阅读thisthisthis 以及其他与继承有关的内容,我阅读的所有内容进一步证实了这应该是可能的。

这可能与 gradle 有关吗?我也非常详细地浏览了项目和应用程序级别的 gradle 文件,试图消除任何可能的重复依赖项,或者可能导致混叠的事情,但除此之外,我还遇到了一些想法。关于在哪里继续寻找错误的任何其他想法,或者您能否解释为什么这从根本上不起作用(即这不是代码中的错误,而是我对继承的理解中的错误)?

【问题讨论】:

    标签: java android oop inheritance


    【解决方案1】:

    尽管出现了 linter 错误,但我还是尝试构建,并收到了更多帮助的错误。这似乎是构建错误的起源,这是在public abstract class MyCustomClassC extends MyCustomClassA的定义中抛出的:

    错误:无法访问 BaseClass

    所以看起来MyCustomClassC 可以毫无问题地访问MyCustomClassA,但不能访问MyCustomClassA 的父级(BaseClass)。

    回顾我的 gradle 构建文件,我似乎找到了问题所在。我以前在 MyCustomClassC 应用级 gradle 构建文件中只有这个依赖项:

    dependencies {
        implementation(project(":packageBModule"))
    }
    
    

    packageB 的依赖关系在他们自己的构建文件中。

    dependencies {
        implementation(project(":packageAModule"))
    }
    
    

    但是在将两者的依赖项添加到我的packageCModule 构建文件之后,即:

    dependencies {
        implementation(project(":packageBModule"))
        implementation(project(":packageAModule"))
    }
    
    

    一切都解决了。我的印象是我不必在每个子类模块中指定所有父类的依赖关系,它们将通过继承引入,但这似乎是一个不正确的假设。看起来我最终需要咬紧牙关,开始更详细地阅读 gradle 文档,因为我猜有一种更优化的方式来管理继承类的依赖关系,而不是仅仅将它们复制并粘贴到一个不断增长的列表中更深的继承子类。

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 2021-10-08
      • 2018-04-07
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      相关资源
      最近更新 更多