链接文章中的例子有点人为和人为(如奇数名称A,B等所示).但是,让我们关注您的问题引用的引用部分:
“…without adding any type information (that is, without allowing any upcasting).”
该类可以提供此接口的多个(公共或私有)实现.但关键是:
没有人能够弄清楚他们是否实现了这个界面.
简单来说,因为界面不公开.
我试图创建一个显示可能的应用案例的示例.当然,它仍然是人为的,但可能会更明显.考虑您要为树数据结构建模,该结构由Node对象组成.这些可以是InnerNode对象(具有子节点)或LeafNode对象(没有子节点).
这样的类可以像这样实现:
class Tree {
// The private interface
private interface Node {
List getChildren();
}
// Both are public implementations
public class InnerNode implements Node {
@Override
public List getChildren() {
return Arrays.asList(getLeafNode(), getLeafNode());
}
}
public class LeafNode implements Node {
@Override
public List getChildren() {
return Collections.emptyList();
}
}
// These return the concrete, public types
public InnerNode getInnerNode() { return new InnerNode(); }
public LeafNode getLeafNode() { return new LeafNode(); }
// This returns the private interface type
public Node getRootNode() {
// Both concrete types can be returned here,
// because they both implement the interface
return getInnerNode(); // Works
//return getLeafNode(); // Works
}
// This uses only the interface type
public void traverseNode(Node node) {
System.out.println("Traversing "+node);
for (Node child : node.getChildren()) {
traverseNode(child);
}
}
}
在外部main方法中,您可以观察私有接口施加的限制:
public static void main(String[] args) {
Tree tree = new Tree();
// The public concrete types can be used
Tree.LeafNode leafNode = tree.getLeafNode();
Tree.InnerNode innerNode = tree.getInnerNode();
// The private interface can not be used from outside:
//Tree.Node node = tree.getRootNode();
// This is possible: The class only uses its
// own private interface here
tree.traverseNode(tree.getRootNode());
}
在此示例中,您可以调用traverseNode,传入getRootNode返回的Node,无论此节点是InnerNode还是LeafNode.在当前版本中,这将打印出类似的内容
Traversing Tree$InnerNode
Traversing Tree$LeafNode
Traversing Tree$LeafNode
如果您更改了getRootNode以返回LeafNode,那么它只会打印
Traversing Tree$LeafNode
简单地说,并且正如名称“私有接口”已经暗示的那样:您可以使用它来隐藏两个类共享一个共同祖先的事实.