任何人都可以告诉我为什么我会收到错误说
隐式超级构造函数Node()未定义。必须明确 调用另一个构造函数
我知道在某些情况下,当Java编译器版本与代码混合时,eclipse会出现此错误,但对我来说情况并非如此。这是我的代码,错误发生在Queue2构造函数的Queue2类中。
import java.util.NoSuchElementException;
public class Queue2<T, Item> extends Node<T> {
private Node<T> head;
private Node<T> tail;
// good practice to initialize all variables!
public Queue2() {
head = null;
tail = null;
}
public void enqueue(T newData) {
// make a new node housing newData
Node<T> newNode = new Node<T>(newData);
// point _head to newNode if queue is empty
if (this.isEmpty()) {
_head = newNode;
}
// otherwise, set the current tail’s next
// pointer to the newNode
else {
_tail.setNext(newNode);
}
// and make _tail point to the newNode
_tail = newNode;
}
// in class Queue<Type> …
public Type dequeue() {
if (this.isEmpty()) {
return null;
}
// get _head’s data
Type returnData = _head.getData();
// let _head point to its next node
_head = _head.getNext();
// set _tail to null if we’ve dequeued the
// last node
if (_head == null){
_tail = null;
}
return returnData;
public boolean isEmpty() {
// our Queue is empty if _head
// is pointing to null!
return _head == null;
}
}
这是超级班......而且我意识到吸气剂和制定者并不完整,但我相信这与我的错误无关? :S
public class Node<Type> {
private Type _data;
private Node<Type> _nextNode;
public Node(Type newData) {
_data = newData;
_nextNode = null;
}
public void setNext(Node<T> newNextNode){
}
public Node<Type> getNext() {
}
public Type getData() {
}
public void setData(Node<T> newData){
}
}
顺便说一下,这只是做一些队列练习的一些代码!
在此先感谢大家!
答案 0 :(得分:2)
我怀疑 Node<T>
的唯一构造函数是这样的:
public Node<T>(T value)
这完全合理 - 节点应该有一个值。然后你的Queue2
构造函数失败了,因为:
public Queue2() {
head = null;
tail = null;
}
隐含地:
public Queue2() {
super(); // This is what's failing.
head = null;
tail = null;
}
远没那么明白的原因是Queue2
首先扩展Node
。只需使用组合而不是继承。为什么要将队列视为节点?队列的节点值是多少?什么是上一个节点?下一个节点是什么?
答案 1 :(得分:0)
因为Node class
中没有默认的非私有构造函数。您必须在Node class
中定义默认构造函数,或从Node class
Queue class
的另一个构造函数
或者避免这种疯狂的解决方案导致Queue可能会保留Node对象,而不是来自Node class
答案 2 :(得分:0)
问题是您有Queue2<T, Item> extends Node<T>
,没有有Node<T>
的无参数构造函数,而Queue2<T, item>
的构造函数是Node<T>
不表示应该调用哪个Queue2<T, Item>
构造函数。
我认为你实际上不希望Node<T>
成为public class Queue2<T, Item> extends Node<T> {
的子类(你有a has-a relationship,而不是an is-a relationship),所以改变这个:
public class Queue2<T, Item> {
到此:
{{1}}
答案 3 :(得分:0)
当你创建一个类并且没有定义构造函数时,Java会为你定义一个隐式的,没有参数(并且什么都不做)。
当发生这种情况但你继承自另一个类(如继承自Node的Queue2)时,这个隐式构造函数也将调用父类构造函数,因此等效于:
public Queue2() {
super();
}
您看到的错误与父类没有默认(无参数)构造函数的事实相关联,因此这种“隐式”代码无效。
要解决此问题,请自己定义构造函数,传递Node构造函数所需的任何参数。请参阅此处的official doc。