三个不同的包包含:
- 接口(MyInterfaceInner);
- 祖先类(GeneralClass),它有一个受保护的内部类(ProtectedClass);
- 类是后继类(DerivativeClass)。
我无法在后代类中编写返回对祖先内部类的对象的引用的方法。这个想法建议创建一个 ProtectedClass 类public,在这种情况下一切正常。因为 由于修饰符protected将其访问权限扩展到其继承者(这似乎是我的情况),因此令人惊讶的是代码无法编译。谁能解释一下发生了什么事吗?
public interface MyInterfaceInner {
void print();
}
public class GeneralClass {
protected class ProtectedClass implements MyInterfaceInner {
@Override
public void print() {
System.out.println("Как здорово, что все мы здесь сегодня собрались");
}
}
}
public class DerivativeClass extends GeneralClass {
public ProtectedClass getProtectedClass() {
GeneralClass g = new GeneralClass();
// в этой строке код не компилируется
GeneralClass.ProtectedClass p = g.new ProtectedClass();
return p;
}
}
首先要注意的是,上述问题对于问题中提供的代码是不可重现的,因为默认情况下它在同一个包中具有所有类。
因此,问题中提供的代码应该直接表明所有类都位于单独的包中。
事实上,问题中描述的问题是由于隐式默认构造函数与声明它们的类具有相同的访问说明符,即一个类
ProtectedClass也有其默认的隐式构造函数protected。也就是说,只能从满足以下条件的类访问此类构造函数:
GeneralClass.ProtectedClassGeneralClass.ProtectedClass不然。DerivativeClassGeneralClass因此,您应该至少
GeneralClass.ProtectedClass通过公开类构造函数来提供对它的访问:当然,如果该类
ProtectedClass(及其默认构造函数)具有公共访问权限,则不会出现此问题。或者您应该
DerivativeClass另外在类中创建一个内部类 - 该类的后代ProtectedClass并相应地返回其实例:关于主要SO的类似问题:受保护的嵌套类无法访问其他包中的派生类(2012)