PersonQueue не является абстрактным и не переопределяет абстрактный метод addLast () в очереди - PullRequest
0 голосов
/ 08 мая 2018

У меня есть следующий интерфейс:

public interface Queue<T>{
    void addLast(T o) throws IllegalStateException;
}

Затем следующий класс, реализующий его:

public class PersonQueue implements Queue{
    private Person[] queue = new Person[1000];
    private int curIndex = 0;

    public void addLast(Person person) throws IllegalStateException{
        if(queue.length > curIndex){
            queue[curIndex] = person;
            curIndex++;
        }else{
            throw new IllegalStateException("Queue is already full");
        }
    }
}

По какой-то причине это вызывает следующую ошибку:

.\PersonQueue.java:1: error: PersonQueue is not abstract and does not 
override abstract method addLast(Object) in Queue
public class PersonQueue implements Queue{
       ^
1 error

При замене моей функции public void addLast(Person person) пустой функцией public void addLast(Object o) она работает.

Я искал похожие ошибки, но все они вызваны несоответствием объявленных правил интерфейса и реализующего класса,однако я не вижу, как мой реализующий класс нарушает интерфейс, поскольку T является универсальным для типа, а Person является типом.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Когда вы объявляете интерфейс очереди, вы используете <T>, который является универсальным параметром типа объекта.

Таким образом, когда вы реализуете его, вам нужно передать класс в качестве параметра (т.е. Queue<Person>), как показано ниже:

public class PersonQueue implements Queue<Person>{
    private Person[] queue = new Person[1000];
    private int curIndex = 0;

    @Override
    public void addLast(Person person) throws IllegalStateException{
        if(queue.length > curIndex){
            queue[curIndex] = person;
            curIndex++;
        }else{
            throw new IllegalStateException("Queue is already full");
        }
    }

}
0 голосов
/ 08 мая 2018

Объявите PersonQueue для реализации Queue<Person>. В противном случае компилятор не знает, что универсальный тип T действительно означает Person в вашем контексте. После этого изменения addLast подпись будет:

public void addLast(Person o) throws IllegalStateException { ... }

(это то, что у вас уже есть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...