从另一个不同包的实例的子类调用protected方法

Nik*_*s R 4 java packages protected subclass access-modifiers

我想从提供此受保护方法的类的子类中调用另一个实例的受保护方法.请参阅以下示例:

public class Nano {

    protected void computeSize() {
    }

}

public class NanoContainer extends Nano {

    protected ArrayList<Nano> children;

}

public class SomeOtherNode extends NanoContainer {

    // {Nano} Overrides

    protected void computeSize() {
        for (Nano child: children) {
            child.computeSize();            // << computeSize() has protected access in nanolay.Nano
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

javac告诉我computeSize() has protected access in Nano.我看不出这个的原因(我以为我已经在其他一些代码中这样做了).我想保护这种方法,我该怎么办?

javac version "1.7.0_09"
Run Code Online (Sandbox Code Playgroud)

编辑

我想提供一个精简版本,但我没有想到这样的事实,即这些类位于不同的包中.

nanolay.Node
nanolay.NanoContainer
nanogui.SomeOtherNode
Run Code Online (Sandbox Code Playgroud)

Mis*_*ble 12

不知道原理,但JLS在6.6.2中证实了这一点.受保护访问的详细信息(强调我的):

受保护的成员或对象的构造函数可以从包外部访问,只能通过负责实现该对象的代码来声明它.

所以:

package P2;
public class P2 {
    protected void foo() {}
}

.........

package P2A;    
class P2A extends P2.P2 {
    void bar(P2.P2 other) {
        this.foo(); // OK
        other.foo();  // ERROR
    }

    void bar2(P2A other) { 
        other.foo(); //OK
    }
}   
Run Code Online (Sandbox Code Playgroud)

P2A.bar一个调用this.foo()是可访问的,因为this负责执行P2other.foo()不可访问,因为other可能不是一个P2A.bar2另一方面有一个P2A所以它是好的.

现在,为什么一切都好,如果它们都是相同的包,但如果它们是不同的包呢?理由是什么?我不知道也想知道.

元评论我已经回滚了另一个用户的最新更新,因为它实质上改变了答案,可能更适合作为顶级答案本身.


Sco*_*ion 7

您可以通过子类化和覆盖来访问受保护的方法; 当它们在同一包装中可用时.我会补充一些细节.你可以在这里阅读细节.

您拥有的示例是protected clone()在java中的Object类中可用的方法的行上; 你不能直接在任何对象上调用它(尽管所有对象都隐式地从Object类扩展).