2010-12-02 190 views
0

我试图用Java中的任意键实现递归树结构。基本上我想要的是一个Tree<X,Y>其中包含一个X和更多(子)树,由一组Y s索引。但是,我认为,因为树将用于索引只读磁盘文件中的数据,所以树本身应该是只读的。所以,为了创建它们,我创建了一个子类MutableTree,它应该允许编辑Tree继承与泛型

这里是我的代码:

public class Tree<C,K> implements Serializable { 

    protected C content; 
    protected java.util.HashMap<K, Tree<C,K>> nexts; 

    protected Tree() {} 

    public C getContent() { 
     return content; 
    } 
    public java.util.Iterator<K> getKeys() { 
     return nexts.keySet().iterator(); 
    } 
    public Tree<C,K> descend(K key) { 
     return nexts.get(key); 
    } 
} 

而对于MutableTree

public class MutableTree<C,K> extends Tree<C,K> { 
    public MutableTree (Tree<C,K> par) { 
     super(); 
     this.content = par.content; 
     this.nexts = par.nexts; 
    } 

    public MutableTree() { 
     super(); 
    } 

    public void setContent (C c) { 
     this.content = c; 
    } 

    public MutableTree<C,K> addKey (K k) { 
     MutableTree<C,K> noo = new MutableTree<C,K>(); 
     nexts.put(k, noo); 
     return noo; 
    } 

    public boolean delKey (K k) { 
     return (nexts.remove(k)!=null)?true:false; 
    } 

}

这段代码不能编译,而是选择抱怨Tree.contentTree.nexts保护。正如你所看到的,他们确实是。但是,由于MutableTreeTree的子类,是否应该不能访问其父级的受保护字段?

感谢您的任何帮助。

+0

是不是Google Guave(或者现在称为Google Collections项目的任何东西)有一棵树可以使用? – TheLQ 2010-12-02 01:58:17

+0

不是我所知道的;我会再检查一次。编辑:不,谢谢。 – Actorclavilis 2010-12-02 02:02:03

回答

3

您只能通过与您的代码或子类型相同的类型的引用来访问protected成员。

就你的情况而言,因为创建MutableTree将允许客户端代码改变一个据称不可变的Tree