Тип возвращаемого значения несовместим с 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 иметь одинаковые имена с разными типами возвращаемых данных?