问题描述
问题
如下面的伪代码中所定义,为什么在单独的包(setContentView
)中定义的父类(MyCustomClassA
)的继承的公共方法(packageB
)无法解析尽管在上述父类(myPublicmethod
中直接定义了公共方法,但还是可以解析?
由于myPublicmethod
和setContentView
都是公共方法,我对为什么一个人能够解决而另一个人却不能解决感到困惑。
最小示例伪代码
下面的伪代码中显示了层次结构的摘要,以及描述了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
}
}
到目前为止我尝试过什么:
- 使用Android Studio,我按住Ctrl键并单击父类,并确认它们都指向正确的类。
- 我构建->清理项目并使缓存无效,然后重新启动以确保缓存中的所有内容均已过时。
- 我创建了一个伪类
MyCustomClassB
,以测试setContentView
方法在同一包中是否可解析。它确实解决了。这使我认为这可能是程序包/受保护的问题或其他访问问题,但是由于setContentView
是Activity中的一种公共方法,因此我对其他故障排除思路感到困惑。 - 阅读this,this和this以及其他与继承相关的内容,我所读的所有内容都进一步证实了应该是可能的。 / 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文档,因为我猜想有一种更好的方法来管理继承类的依赖关系,而不仅仅是将它们复制并粘贴到一个不断增长的列表中。继承更深的子类。