【发布时间】:2015-08-28 09:52:54
【问题描述】:
下面是基类相关代码DblyLinkList,完整代码为DblyLinkList类here,
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<T>.DListNode<T>(T, DblyLinkList<T>.DListNode<T>, DblyLinkList<T>.DListNode<T>) 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<T> extends DblyLinkList<T>.DListNode<T> { ... -
如果您更具体地描述问题而不是“这不起作用”,将会有所帮助。您的编译器/IDE 报告是否提供错误消息?是运行时行为没有按预期工作?
-
@A4L 正如您所说,我进行了更改,它正在工作。为什么它有效?
-
@overexchange 问题是你的两个内部类都没有定义为
static这意味着它们只能存在于外部类的上下文中,所以为了引用这样一个你需要的类指定其全名,即包括父类的名称DblyLinkList<T>.DListNode<T>。但这并没有多大意义,它们应该声明为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