Наследование с помощью дженериков - PullRequest
0 голосов
/ 02 декабря 2010

Я пытаюсь реализовать рекурсивную древовидную структуру с произвольными ключами в Java.По сути, я хочу иметь Tree<X,Y>, который содержит X и более (под) деревья, проиндексированные набором Y с.Тем не менее, я думаю, что поскольку деревья будут использоваться для индексации данных в файле только для чтения, само дерево должно быть доступно только для чтения.Итак, для их создания я создал подкласс 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.content и Tree.nexts защищены.Как видите, они действительно есть.Однако, поскольку MutableTree является подклассом Tree, не должен ли он иметь доступ к защищенным полям своих родителей?

Спасибо за любую помощь.

1 Ответ

3 голосов
/ 02 декабря 2010

Вы можете получить доступ к protected членам только через ссылки того же типа, что и ваш код, или подтипа.

Точно так же, как и в вашем случае, потому что создание MutableTree позволит клиентскому коду мутироватьпредположительно неизменный Tree.

...