Ошибка Java - arrayqueue.ArrayQueue не является абстрактным и не переопределяет абстрактный метод dequeue()

У меня проблемы с ошибкой Java, в частности, с этой:

arrayqueue.ArrayQueue не является абстрактным и не переопределяет абстрактный метод dequeue() в arrayqueue.Queue в 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 вопросов подряд, но концептуально это меня сбивает с толку. Я ценю любую помощь.


person Solsma Dev    schedule 20.10.2013    source источник
comment
В сообщении говорится, что вы не реализовали все методы, определенные в интерфейсе.   -  person Oliver Charlesworth    schedule 20.10.2013
comment
E — это тип элемента в очереди, интерфейс подобен контракту, он определяет методы, необходимые в реализации, поэтому вам должно реализовываться size, isEmpty, ... из интерфейса Queue   -  person    schedule 20.10.2013
comment
Итак, мне просто нужно определить методы в интерфейсе Queue, чтобы устранить ошибку?   -  person Solsma Dev    schedule 20.10.2013


Ответы (1)


«E» — это заполнитель для типа (String, Integer и т. д.). Что-то вроде E используется, когда вы определяете «шаблон». В Java есть возможность предоставить «общий» класс-шаблон, который можно использовать для создания класса, предназначенного для обработки определенного типа. Итак, если бы у вас был класс шаблона Blah<E>, вы могли бы создать экземпляр класса типа Blah<String>... и затем, бам, у вас есть Blah, который обрабатывает только объекты String.

В этом случае у вас есть универсальный интерфейс. Вы определяете универсальный класс, который использует универсальный интерфейс, который обрабатывается таким же образом.

Теперь интерфейс — это просто «спецификация», которая гарантирует, что ваш класс реализует определенные методы. Таким образом, когда у вас есть класс Meatball, реализующий Woogie, который определяет методы X, Y и Z, это означает, что остальной мир Java теперь знает, что Meatball гарантированно имеет методы X, Y и Z.

Что вам нужно сделать при реализации общего интерфейса, такого как ArrayQueue<E>, так это продолжать определять класс с E вместо типа, который вы фактически могли бы использовать для обработки ArrayQueue. Когда вы фактически создаете экземпляр класса, если вы хотите, чтобы ваш ArrayQueue хранил строки, вы бы сказали

ArrayQueue<String> myQueue = new ArrayQueue<String>

... Но позже вы можете использовать его снова и заменить String на Integer при создании "их очереди". Java будет обеспечивать, чтобы каждый ArrayQueue содержал только определенный тип объекта.

Таким образом, вам необходимо реализовать все методы, которые гарантирует Queue (которые вы указали), сохраняя их общими в вашем классе ArrayQueue<E>, поэтому Java не будет жаловаться на использование вами интерфейса Queue.

person sdanzig    schedule 20.10.2013
comment
Итак, я попытался реализовать метод dequeue() в классе ArrayQueue следующим образом: @Override public E dequeue(){ if(isEmpty() == true){throw EmptyQueueException;} E temp = Q[f]; Q[f] = null; f = (f+1)%Q.length; return temp;} Как только я реализую все методы, перечисленные в интерфейсе Queue, я больше не должен видеть эту ошибку? - person Solsma Dev; 21.10.2013
comment
Я должен извиниться ... Stackoverflow по умолчанию скрывает параметры шаблона, если вы не укажете их в блоке кода ... поэтому я обновил свой ответ, чтобы показать их. Надеюсь, вас это не сильно смутило. Вы правы, когда говорите, что пока вы реализуете методы с сигнатурами, определенными в интерфейсе Queue, вы избавитесь от ошибки. И последнее... этот метод isEmpty(), который вы используете для проверки... вы должны стараться избегать использования методов, которые доступны в вашем общедоступном API. Подробнее об этом читайте в книге Джоша Блоха «Эффективная Java». - person sdanzig; 21.10.2013
comment
Спасибо. Эти концепции очень чужды программисту на Python. Что касается метода isEmpty(), то он используется именно так в книге, на которую я ссылаюсь. Когда-нибудь, когда у меня будет больше времени, намного больше времени, я проверю Эффективную Java, я слышал, что это часто упоминается. Спасибо еще раз. - person Solsma Dev; 21.10.2013