0

我特别遇到了一个java错误,这个:

arrayqueue.ArrayQueue 不是抽象的,并且不会覆盖 arrayqueue.Queue 中的抽象方法 dequeue() 在 arrayqueue.ArrayQueue.(ArrayQueue.java:11)

这是发生错误的代码:

public class ArrayQueue<E> implements Queue<E> {

E [] Q; 
int f,r;
int size;

static final int CAPACITY = 1000; 
int capacity; 

public ArrayQueue() {
    this(CAPACITY);
}

public ArrayQueue(int cap){
    capacity = cap;
    Q = (E []) new Object[capacity];
    f = 0;
    r = 0;
    size = 0;
}



public static void main(String[] args) {

}

}

第 11 行将是这一行:public class ArrayQueue<E> implements Queue<E> {具体来说,我不明白<E>这一行中的意思是什么。我正在尝试使用循环数组来实现队列 ADT。显然这实现了 Queue 接口,我还不太了解接口的概念(为什么 Java 不能像 Python 一样!?)

作为参考,我还在下面发布了 Queue 接口:

public interface Queue<F> {


public int size();
public boolean isEmpty();
public F front() throws EmptyQueueException;
public void enqueue(F element);
public F dequeue() throws EmptyQueueException;

}

我知道这是连续 5 个问题,但从概念上讲,这让我感到困惑。我很感激任何帮助。

4

1 回答 1

1

“E”是类型(字符串、整数等)的占位符。当你定义一个“模板”时,会使用像 E 这样的东西。Java 有能力提供一个“通用”模板类,它可以用来创建一个用于处理特定类型的类。所以如果你有一个模板类Blah<E>,你可以实例化一个类型的类Blah<String>......然后,bam,你有一个只处理 String 对象的 Blah。

在这种情况下,您有一个通用接口。您正在定义一个使用泛型接口的泛型类,其处理方式相同。

现在,接口基本上只是保证您的类实现特定方法的“规范”。因此,当您有一个实现 Woogie 的 Meatball 类时,它指定了方法 X、Y 和 Z,这意味着 Java 世界的其余部分现在知道 Meatball 保证具有方法 X、Y 和 Z。

在实现诸如 之类的通用接口时,您需要做的ArrayQueue<E>是继续使用 E 定义类,而不是您实际可能使用 ArrayQueue 处理的类型。当您实际实例化该类时,如果您希望 ArrayQueue 存储字符串,您会说

ArrayQueue<String> myQueue = new ArrayQueue<String>

...但是稍后您可以再次使用它,并在创建“theirQueue”时将 String 替换为 Integer。Java 将强制每个 ArrayQueue 仅包含特定类型的对象。

总之,您需要实现 Queue 保证的所有方法(您列出的),在您的ArrayQueue<E>类中保持其通用性,因此 Java 不会抱怨您对 Queue 接口的使用。

于 2013-10-20T16:33:59.943 回答