直接定义的公共方法解析时,无法解析来自单独包的继承的公共方法

问题描述

问题

如下面的伪代码中所定义,为什么在单独的包(setContentView)中定义的父类MyCustomClassA)的继承的公共方法packageB)无法解析尽管在上述父类myPublicmethod中直接定义了公共方法,但还是可以解析?

由于myPublicmethodsetContentView都是公共方法,我对为什么一个人能够解决而另一个人却不能解决感到困惑。

最小示例伪代码

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

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. 我构建->清理项目并使缓存无效,然后重新启动以确保缓存中的所有内容均已过时。
  3. 我创建了一个伪类MyCustomClassB,以测试setContentView方法在同一包中是否可解析。它确实解决了。这使我认为这可能是程序包/受保护的问题或其他访问问题,但是由于setContentView是Activity中的一种公共方法,因此我对其他故障排除思路感到困惑。
  4. 阅读thisthisthis以及其他与继承相关的内容,我所读的所有内容都进一步证实了应该是可能的。 / li>

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

解决方法

尽管有linter错误,但我仍尝试进行构建,并且收到了更多有关错误的帮助。这似乎是构建错误的来源,该错误被抛出到public abstract class MyCustomClassC extends MyCustomClassA的定义中:

错误:无法访问BaseClass

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

回头看一下我的gradle构建文件,我似乎已经发现了问题。我以前在MyCustomClassC应用程序级gradle构建文件中仅具有此依赖项:

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

packageB的依赖项位于其自己的构建文件中。

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

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

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

一切都会解决。我的印象是,我不必在每个子类模块中指定所有父类的依赖关系,并且可以通过继承来引入它们,但这似乎是一个错误的假设。看来我最终需要硬着头皮,开始更详细地阅读gradle文档,因为我猜想有一种更好的方法来管理继承类的依赖关系,而不仅仅是将它们复制并粘贴到一个不断增长的列表中。继承更深的子类。