这是否适用于泛型?

时间:2011-03-05 10:53:42

标签: java generics

是否真的有必要使用'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);
}

3 个答案:

答案 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语言)中,返回类型是“最小公分母”类。方法可以返回该类的对象(或实现接口的对象)或返回类型的子类。