是否真的有必要使用'extends BoardGame'?
如果我删除它,我的代码仍然有效,但我不确定是否应该。
我这样做是因为copy()方法。
任何建议。
由于
public interface BoardGame<GAME extends BoardGame>
{
GAME getGame();
BoardGame<GAME> copy();
int currentPlayer();
boolean isGameOver();
int getTotalMoves();
BoardResult getOutcome(int playerIndex);
void makeMove(int moveIndex);
void addMoveObserver(BoardGameMoveObserver observer);
}
答案 0 :(得分:2)
copy()
返回类型不应该是GAME
吗?
泛型永远不是“必要的”。我们在没有它的情况下生活了十年,这很好。
当泛型创建太多复杂性时,可以删除其中的一些内容。在您的情况下,如果它不是通用的,您始终可以记录copy()
应返回特定类型,并且调用者始终可以手动将返回的对象强制转换为特定类型。这可能比添加此类型参数更简单,只是为了获得一些收益。
P.S。应该是,严格来说,
public interface BoardGame<GAME extends BoardGame<GAME> >
答案 1 :(得分:2)
从某种意义上说,两者都可以正常编译。
如果使用<GAME extends BoardGame>
,则所有实现都需要使用扩展BoardGame的类型参数。如果任何方法接受参数或返回值为GAME,则这是有意义的。
在你的情况下是getGame()
。因此,如果<GAME extends BoardGame>
getGame()
的所有用户都可以计算返回值(至少)是BoardGame。但是在这种情况下,getGame()
可以返回实现类定义的任何类型..
答案 2 :(得分:1)
如果copy方法返回一个实现BoardGame的对象,则不必使用泛型 - 它隐含在接口定义(以及一般的java语言)中,返回类型是“最小公分母”类。方法可以返回该类的对象(或实现接口的对象)或返回类型的子类。