このコードで親の内部クラスを継承する方法は?

How to inherit parent's inner class in this code?


質問 written by overexchange @2015-08-31 08:15:55Z

: 6 : 1 : 83

以下は親クラスDblyLinkList

package JavaCollections.list;

import java.util.Iterator;
import java.util.NoSuchElementException;

public class DblyLinkList<T> implements Iterable<T>{

    class DListNode<T> {

        private T item;
        private DListNode<T> prev;
        private DListNode<T> next;

        DListNode(T item, DListNode<T> p, DListNode<T> n) {
            this.item = item;
            this.prev = p;
            this.next = n;
        }


    }
.....
}

以下は、派生クラスLockableList

  package JavaCollections.list;

    import JavaCollections.list.DblyLinkList.DListNode;

    public class LockableList<T> extends DblyLinkList<T> {

        class LockableNode<T> extends DblyLinkList<T>.DListNode<T> {

            /**
             * lock the node during creation of a node.
             */
            private boolean lock;

            LockableNode(T item, DblyLinkList<T>.DListNode<T> p,
                    DblyLinkList<T>.DListNode<T> n) {
                super(item, p, n); // this does not work
                this.lock = false;
            }

        }

        LockableNode<T> newNode(T item, DListNode<T> prev, DListNode<T> next) {
            return new LockableNode(item, prev, next);
        }

        public LockableList() {
            this.sentinel = this.newNode(null, this.sentinel, this.sentinel);
        }


    .....
 }

上記のコードでclass LockableNode<T> extends DListNode<T>場合、 エラーThe constructor DblyLinkList<T>.DListNode<T>(T, DblyLinkList<T>.DListNode<T>, DblyLinkList<T>.DListNode<T>) is undefinedは、行super(item, p, n)発生しsuper(item, p, n)

このエラーは、 class LockableNode<T> extends DblyLinkList<T>.DListNode<T>によって解決されます

このエラーを理解するにはどうすればよいですか? なぜ解決したのですか?

コメント 1

DListNode保護してみてください: protected class DListNode {...}

written by ニコラスロビンソン @2015-08-31 08:14:41Z

コメント 2

this(item, p, n);super代わりに動作しますか?

written by クレイグ @2015-08-31 08:15:14Z

コメント 3

@NicholasRobinsonそれは問題ではありません。その場合、エラーメッセージが異なるからです。また、それらは同じパッケージに含まれているため、視認性の問題ではないことに注意してください。

written by m0skit0 @2015-08-31 08:18:01Z

コメント 4

@Craig this(item, p, n)は、無限再帰のためにStackOverflowErrorになります。

written by m0skit0 @2015-08-31 08:18:40Z

コメント 5

@ m0skit0おっと。そうだね。:-P署名が同じであることがわかりませんでした。

written by クレイグ @2015-08-31 08:19:41Z

回答 1 written by @2015-08-31 11:04:29Z
5

内部クラスで型変数T再宣言しています。 つまり、内部クラス内では、外部クラスのTは非表示になり、参照できなくなります。

非静的な内部クラスがあるので、そこで型変数T削除するだけです:

class DListNode { ... }

包含クラスから継承するためです(とにかく、おそらく変数が同じであることを意味します)。

コメント 1

ごめんなさい。class DListNode implements Iterable<T>{..}またはclass DListNode { ..}class DListNode { ..}

written by 実装し @2015-08-31 08:43:44Z

コメント 2

申し訳ありませんが、 Iterable<T>実装しないDListNodeを意味しDListNode

written by -Hoopje @2015-08-31 11:05:18Z

コメント 3

java.util.Map<K,V>が表示されている場合、内部interfaceとしてEntry<K,V>がありinterfaceそれで、なぜDListNode<T>代わりにDListNode DListNode<T>を作成できないのですか?

written by 過剰交換 @2015-09-03 03:32:34Z