为什么没有java让我调用这个受保护的函数

时间:2013-01-19 02:45:47

标签: java syntax methods protected

假设以下类结构:

在命名空间内

public abstract class A {

    protected int someVal;
    protected abstract int action();

}
命名空间a.b中的

public class B extends A{

    //magically filled with elements ;)
    List<A> elements; 

    protected int action(){
        someVal = 42; // OK
        int l = 0;
        for (A a : elements){
            l+= a.action(); //FORBIDDEN!!
        }
        return l;
    }
}

所以Eclipse建议我

  

将'action'的可见性更改为'protected'

我觉得有些被骗了。

为什么我被允许实施行动,但不能打电话给它?访问someVal也没问题。

我很清楚将B复制到同一个命名空间中,但是我有很多类可以扩展B或类似的C和D等等,并且喜欢将它们按顺序排列。

或者重新解释我的问题: 这个数据包'thingy'是强制我的类拥有受保护方法的唯一方法,但是从客户端代码中隐藏它吗?

1 个答案:

答案 0 :(得分:2)

从静态类型角度a可能不是B的实例。您无法触及非后代类的受保护(除非通过相同的包退出)。如果有的话,protected应该很少使用。