0

谁能告诉我为什么我得到一个错误说

隐式超级构造函数 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;
        }

    }  

这是超级类......我意识到getter和setter并不完整,但我相信这与我的错误无关?: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){

    }
}

顺便说一句,这只是一些代码来做一些队列练习!先谢谢大家了!!!

4

4 回答 4

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

首先,扩展是没有意义的。只需使用组合而不是继承。为什么要将队列视为节点?队列的节点值是多少?上一个节点是什么?下一个节点是什么?Queue2Node

于 2013-03-07T17:32:15.247 回答
0

因为您在Node class. 您必须在中定义默认构造函数或从您的Node class调用另一个构造函数Node classQueue class

或者避免这种疯狂的解决方案,因为 Queue 可能会保留 Node 对象,而不是派生自Node class

于 2013-03-07T17:29:57.860 回答
0

问题是你有Queue2<T, Item> extends Node<T>,你没有一个无参数Node<T>的构造函数,并且构造函数Queue2<T, item>没有指示Node<T>应该调用哪个构造函数。

我认为你实际上不想Queue2<T, Item>成为Node<T>(你有一个 has-a 关系,而不是一个 is-a 关系)的子类,所以改变这个:

public class Queue2<T, Item> extends Node<T> {

对此:

public class Queue2<T, Item> {
于 2013-03-07T17:31:38.513 回答
0

当您创建一个类但不定义构造函数时,Java 会为您定义一个隐含的,没有参数(并且什么都不做)。

当这种情况发生但您从另一个类继承(例如从 Node 继承的 Queue2)时,此隐式构造函数还将调用父类构造函数,因此相当于:

public Queue2() {
  super();
}

您看到的错误与父类没有默认(无参数)构造函数的事实有关,因此这个“隐式”代码无法工作。

要解决这个问题,请自己定义一个构造函数,传递 Node 构造函数所需的任何参数。请参阅有关此的官方文档

于 2013-03-07T17:34:08.853 回答