这可能是一个愚蠢的问题,因为我是Android编程的新手。我在我的android项目中导入了一个.aar库,我试图在该库中的一个类中访问受保护的最终同步方法。但是,我能够引用类中存在的非同步/最终的其他方法。当我打开从中创建.aar文件的库的源代码时,我能够看到该方法但导入后无法使用它。 你能告诉我这里出了什么问题吗?
答案 0 :(得分:2)
导入 与导入类的字段和方法的可访问性和可见性无关,它只是每次都不输入完整类名的快捷方式使用该班。
要访问特定类的导入 方法 或 字段 ,应标记其前面的修饰符如 公开 。
由于您尝试访问的方法标记为 protected ,因此只有在尝试在扩展类 BaseActivity ,或者如果您从同一个包的类中访问它。
解决方案是扩展BaseActivity,并在您自定义的方法中使用此方法,如下所示:
public class SomeOtherActivity extends BaseActivity{
public void someOtherMethod(Runnable task, long delayMillis){
super.queueEvent(task,delayMills);
}
}
这样,您声明的方法为其他想要使用特定版本的方法排队事件的开发人员提供了一个公共接口。
然而,这不是通过多态或组合来完成的,因此您可能必须确保您确实需要此方法或者是否存在其他现有解决方案,因为原因是原因被标记为 最终 和 受保护 ,如果不处理,可能会导致其他问题。
访问修饰符简介可在此处找到:
The Java tutorials - Controlling Access to Members of a Class
另一方面,这个问题与" synchronized"无关。和#34; final"
关键字 已同步 的简介可在此处找到:
The Java tutorials - Synchronized Methods
关键字 最终 简介可在此处找到:
The Java tutorials - Final Classes and Methods
答案 1 :(得分:1)
当你说"使用"你的意思是呼叫/调用或覆盖?
一个。受保护的方法仅对包和子类可见
B中。最终方法无法覆盖
使用A和B,你可以用这个方法做的唯一事情就是在你的子类中调用它。
答案 2 :(得分:1)
受保护的方法只能由扩展主类的类调用。
要绕过您遇到的此错误,您可以创建一个扩展您的BaseActivity
类的类,然后创建一个调用私有类的公共方法。
这样的事情:
class MyBaseActivity extends BaseActivity {
public final synchronized void myQueueEvent(Runnable task, long delayMillis) {
super.queueEvent(task, delayMillis);
}
}
现在您可以通过致电:MyBaseActivity.myQueueEvent(...);