【问题标题】:How to write constructor in derived inner class?如何在派生内部类中编写构造函数?
【发布时间】:2015-08-28 09:52:54
【问题描述】:

下面是基类相关代码DblyLinkList,完整代码为DblyLinkListhere

package JavaCollections.list;

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

   protected DListNode<T> sentinel;
   protected int size;

   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;
        }
    }

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

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

    .........
}

下面是在同一个包中引入的类LockableList,它为每个节点创建设置lock字段为false。要删除LockableNode 节点,remove() 方法将检查lock 字段的值。

调用super(item, p, n);时,错误The constructor DblyLinkList&lt;T&gt;.DListNode&lt;T&gt;(T, DblyLinkList&lt;T&gt;.DListNode&lt;T&gt;, DblyLinkList&lt;T&gt;.DListNode&lt;T&gt;) is undefined

如何在下面的派生类LockableList.LockableNode 中编写一个可以被重写方法newNode 调用的构造函数?

package JavaCollections.list;

import JavaCollections.list.DblyLinkList.DListNode;

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

    class LockableNode<T> extends DListNode<T>{
        /**
         * Do not 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;
        }
    }

    @Override
    LockableNode<T> newNode(T item, DListNode<T> prev, DListNode<T> next) {
        //return new LockableNode(item, prev, next); //How do i call the constructor?
    }

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

    ........
}

注意:这是一个继承和封装的练习

【问题讨论】:

  • 尝试以下操作:class LockableNode&lt;T&gt; extends DblyLinkList&lt;T&gt;.DListNode&lt;T&gt; { ...
  • 如果您更具体地描述问题而不是“这不起作用”,将会有所帮助。您的编译器/IDE 报告是否提供错误消息?是运行时行为没有按预期工作?
  • @A4L 正如您所说,我进行了更改,它正在工作。为什么它有效?
  • @overexchange 问题是你的两个内部类都没有定义为static 这意味着它们只能存在于外部类的上下文中,所以为了引用这样一个你需要的类指定其全名,即包括父类的名称DblyLinkList&lt;T&gt;.DListNode&lt;T&gt;。但这并没有多大意义,它们应该声明为static,因为您不希望并且需要创建外部类的实例才能拥有节点实例。因此,您可以将 static 添加到内部类的声明中,并像以前一样保留 extends
  • @A4L static class DListNode? static class LockableNode?我不明白你的意思。我将如何编写像return new DListNode(item, prev, next);return new LockableNode(item, prev, next); 这样的代码?我认为实际原因/修复是here

标签: java generics inheritance


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

    你没有给构造函数acces level,那么默认情况下:

    Modifier    Class   Package     Subclass    World
    no modifier     Y         Y            N        N
    

    这被称为 package-private,即使内部子类在同一个包中,也无法访问此构造函数。这是因为是一个内部类,所以即使子类可以访问super(),内部类也不能。

    所以:

    public class LockableList<T> extends DblyLinkList<T> {
    
        LockableList() {
            super();  //this work
        }
    
        class LockableNode<T> extends DListNode<T>{
            LockableNode(T item, DblyLinkList<T>.DListNode<T> p, DblyLinkList<T>.DListNode<T> n) {
            super(item, p, n); //this does not work
        }
    }
    

    如果您声明DblyLinkListpublic 或protected 的构造函数,则可以从内部类访问。

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

    Modifier    Class   Package     Subclass    World
    public          Y         Y            Y        Y
    protected       Y         Y            Y        N
    

    还要查看this question 以了解Java 中的访问级别

    【讨论】:

    • 添加多少额外的代码行 @RobbyCornelissen ?因为您的解决方案本身不起作用......
    • 问题与访问修饰符无关。这是被遮蔽的类型参数。
    • @RobbyCornelissen 首先确保DblyLinkList 类的所有访问级别和设计都没有问题。我在查询中粘贴DblyLinkList 类的链接。我已经在 codereview.SE 上查看了 DblyLinkList 课程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2014-03-26
    • 2010-12-25
    • 2018-07-21
    • 2021-11-11
    • 2014-02-03
    • 2014-03-16
    相关资源
    最近更新 更多