我正在尝试为我的国际象棋游戏设计撤消/重做机制。我决定使用堆栈数据结构,它将构建在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;
}
}
提前致谢..
答案 0 :(得分:4)
这是问题所在:
public class UndoStack<Move> extends ArrayList<Move>
那是使用Move
作为泛型类型参数,而实际上你根本不需要泛型类型 - 你只想使用Move
作为类型< ArrayList<E>
的em>参数。你想要:
public class UndoStack extends ArrayList<Move>
这应该可以解决问题 - 虽然我个人强烈建议在这里使用合成而不是继承。 (换句话说,让你的UndoStack
类型包含一个ArrayList<Move>
- 或类似的东西 - 而不是继承它。)
此外,这永远不会起作用:
UndoStack undoStack;
private UndoStack() {
undoStack = new UndoStack();
}
这意味着要创建UndoStack
,您需要创建另一个UndoStack
...您希望如何发生这种情况?你现在会得到一个堆栈溢出异常......为什么你需要变量呢?