Тип возвращаемого значения несовместим с LinkedList<T>

Eclipse выдает мне несовместимую ошибку возвращаемого типа в унаследованном методе, который я переопределил.

У меня есть универсальный класс SomeQueue, который расширяет LinkedList и реализует универсальный, это мой универсальный класс SomeList

public abstract class SomeQueue<T> extends LinkedList<T> implements SomeList<T>{
private int capacity=100;
public SomeQueue(){
 super();
Queue<E> tqueue=new LinkedList<T>();
T front=null;
T back=null;}

@Override
public boolean isEmpty(){}

@Override
public E get(int index){}

@Override
public int size(){}

@Override
public void add(T thing){}

@Override
public E removeEnd(){}

@Override
public void addFirst(T thing){}

@Override
public T remove(int index){}
}

и вот мой интерфейс SomeList

public interface SomeList<T>{
public boolean isEmpty();
public T get(int index);
public int size();
public void add(T item);
public T removeEnd();
public void addFirst(T thing);
public T remove(int index);}

Затмение дает мне ошибку на add(T thing) метод в QueueLis<T> учебный класс. это явно говорит о том, что

Тип возврата несовместим с LinkedList<T>.add(T)

и предлагает изменить тип возвращаемого значения на логическое, что я не хочу делать. @Override выше add(T thing) Метод в SomeQueue, похоже, не работает.

1 ответ

Решение

Эта ошибка появляется потому, что класс расширения / реализации имеет два метода с одинаковыми именами и типами аргументов (подпись) и разными типами возвращаемых данных. В этом случае компилятор жалуется конкретно на add(T) метод.

Ваш LinkedStack класс, вероятно, расширяется LinkedList и, следовательно, его boolean add(T) метод. void add(T) метод, унаследованный от SomeList и переопределить в SomeQueue несовместимо с тем, что в LinkedList потому что они имеют разные типы возвращаемых данных (и одно и то же имя и аргументы).

Короче говоря, когда вы позвонили SomeQueue.add(T) компилятор не будет знать, если вы хотите вызвать метод, который возвращает boolean или тот, который возвращает int,

Другими словами, когда вы определяете void add(T t), @Override не совпадает LinkedList.add(T) (который возвращает boolean), и если вы сделали это вернуть boolean @Override не будет соответствовать SomeList.add(T), который должен вернуться void,

Как примечание, просто имея реализацию класса SomeList и расширить LinkedList без определения add метод:

public abstract class SomeQueue<T> 
                extends LinkedStack<T> 
                implements SomeList<T>{ /* Empty class definition */ }

компилятор должен уже выдавать ошибку в соответствии с

Типы возвращаемых данных несовместимы для унаследованных методов LinkedStack.add(E), LinkedList.add(E)

Вы должны действительно рассмотреть, если вам это нужно add метод, как в SomeList интерфейс (вы также можете изменить его имя), и если вам действительно нужно, чтобы он был таким, как сейчас, то отсоедините ваш класс от всего Collection иерархия.

Смежный вопрос: могут ли два метода Java иметь одинаковые имена с разными типами возвращаемых данных?

Другие вопросы по тегам