队列实现构造函数错误JAVA

时间:2013-03-07 17:29:22

标签: java eclipse oop queue nodes

任何人都可以告诉我为什么我会收到错误说

  

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

    }
}
顺便说一下,这只是做一些队列练习的一些代码! 在此先感谢大家!

4 个答案:

答案 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