метод не переопределяет или не реализует метод из ошибки супертипа

Вопрос: Я пытаюсь создать механизм отмены/повтора для своей шахматной игры. Я решил использовать структуру данных стека, которая будет построена на ArrayList. Я также хочу, чтобы мои классы UndoStack и RedoStack были одиночными. Однако я Получать method does not override or implement a method from a supertype pop() in UndoStack cannot implement pop() in IStackable return

Вопрос:

Я пытаюсь создать механизм отмены/повтора для своей шахматной игры. Я решил использовать структуру данных стека, которая будет построена на ArrayList. Я также хочу, чтобы мои классы UndoStack и RedoStack были одиночными. Однако я Получать

method does not override or implement a method from a supertype pop() in UndoStack cannot implement pop() in IStackable return type Move is not compatible with cgas5.Move where Move is a type-variable: Move extends Object declared in class UndoStack

ошибка..

Вот мой интерфейс IStackable:

package cgas5; public interface IStackable { abstract public Move pop(); abstract public void push(Move m); }

и мой класс UndoStack

package cgas5; import java.util.ArrayList; public class UndoStack<Move> extends ArrayList<Move> implements IStackable { UndoStack undoStack; private UndoStack() { undoStack = new UndoStack(); } public UndoStack getUndoStack() { if (undoStack == null) { undoStack = new UndoStack(); } return undoStack; } @Override public Move pop() { Move m = get(size() — 1); remove(size() — 1); return m; } @Override public void push(Move m) { add(m); } }

и если это необходимо, мой класс Move:

package cgas5; public class Move { private Piece pieceToMove; private Square currentSquare; private Square targetSquare; private Piece capturedPiece; private Piece promotedPiece; public Move(){ } public Move(Piece pieceToMove, Square currentSquare, Square targetSquare){ this.pieceToMove = pieceToMove; this.currentSquare = currentSquare; this.targetSquare = targetSquare; } public Piece getPieceToMove() { return pieceToMove; } public void setPieceToMove(Piece pieceToMove) { this.pieceToMove = pieceToMove; } public Square getCurrentSquare() { return currentSquare; } public void setCurrentSquare(Square currentSquare) { this.currentSquare = currentSquare; } public Square getTargetSquare() { return targetSquare; } public void setTargetSquare(Square targetSquare) { this.targetSquare = targetSquare; } public Piece getCapturedPiece() { return capturedPiece; } public void setCapturedPiece(Piece capturedPiece) { this.capturedPiece = capturedPiece; } public Piece getPromotedPiece() { return promotedPiece; } public void setPromotedPiece(Piece promotedPiece) { this.promotedPiece = promotedPiece; } }

Заранее спасибо..

Лучший ответ:

Это проблема:

public class UndoStack<Move> extends ArrayList<Move>

Это использование Move в качестве типичного параметра типа, тогда как на самом деле вам вообще не нужен общий тип – вы просто хотите использовать Move как аргумент type для ArrayList<E>. Вы хотите:

public class UndoStack extends ArrayList<Move>

Это должно решить проблему – хотя лично я настоятельно рекомендую использовать композицию вместо наследования здесь. (Другими словами, чтобы ваш тип UndoStack содержал ArrayList<Move> – или нечто подобное, а не подклассифицировал его.)

Кроме того, это никогда не сработает:

UndoStack undoStack; private UndoStack() { undoStack = new UndoStack(); }

Это означает, что для создания UndoStack вам нужно создать еще один UndoStack… как вы ожидаете, что это произойдет? В настоящее время вы получаете исключение… зачем вам нужна переменная вообще?

Оцените статью
Добавить комментарий