包級可見性仍允許同包類依賴具體實現類。內部類配合上溯造型:
private/protected,外部完全不可見。
public class Parcel3 {
private class PContents extends Contents { ... } // 完全隱藏
protected class PDestination implements Destination { ... } // 僅繼承者可見
public Destination dest(String s) { return new PDestination(s); }
public Contents cont() { return new PContents(); }
}
class Test {
Parcel3 p = new Parcel3();
Contents c = p.cont(); // OK
Destination d = p.dest("Tanzania"); // OK
// Parcel3.PContents c2 = p.new PContents(); // 編譯錯誤:private 不可見
}
PContents 為 private,連同包類都不可訪問,徹底封裝。PDestination 為 protected,允許繼承者訪問,平衡擴展與封裝。Contents/Destination 引用,不知具體類型,也無法強轉。private/protected,這是內部類獨有優勢。「接口/抽象類定義契約,private 內部類實現細節,公開方法返回接口引用。」
這是 Java 實現「接口與實現分離」最徹底、編譯器支持最好的模式。