2015-01-07 139 views
0

我有一个应用程序,用户可以在其中玩很多类型的游戏。每场比赛延伸了Game课程,其中有各种与游戏相关的内容。每个游戏还有一个相关的用户类别,它扩展了User(包含电子邮件,用户名等),如ChessUserScrabbleUser,其中包含有关游戏的统计信息和其他用户信息。指定子类中的集合类型

在每个Game类中,我需要一个当前正在玩游戏的所有用户的列表。因为所有的游戏都需要这个列表,我想把它放在User类中,但是它包含了玩游戏的用户类型(ChessGame将包含一个ChessUsers列表),我不能在没有在检索时转换值宁可不做。有没有方法做到这一点,而无需投射检索值?

一些示例代码:

public class Game { 
    private List<Player> players; 

    public Player getPlayer(int index) { 
    return players.get(index); 
    } 
} 

public class Player { 
    private String username; 
    private String email; 
} 

public class ChessGame extends Game { 
    // getPlayer now needs to return a ChessPlayer, hopefully without casting 
} 

public class ChessPlayer extends Player { 
    private int checkmates; 
} 
+0

您正在寻找的是[泛型](http://docs.oracle.com/javase/tutorial/java/generics/index.html)。 –

+0

检查'getPlayer'。返回类型不是void,而是Player。 –

回答

5

使用泛型:

public class Game<T extends Player> { 

    private List<T> players; 

    public T getPlayer(int index) { 
     return players.get(index); 
    } 
} 

public class Player { 
    private String username; 
    private String email; 
} 

public class ChessPlayer extends Player { 

} 

public class Chess extends Game<ChessPlayer> { 

} 
+0

泛型是否适合这样的事物?我一直认为这个观点更多的是那些完全存在的类是提供某种类型的对象。 – user2248702

+0

泛型类型是对某个类的某种改进。在这种情况下,您可以指出,ChessPlayers在国际象棋中扮演的角色。 –

2

您可以使用Java Generics得到这个功能:

public class Game<T extends Player> { 
    private List<T> players; 

    public T getPlayer(int index) { 
    return players.get(index); 
    } 
} 

然后指定子类中的正确类型的将由getPlayer方法返回:

public class ChessGame extends Game<ChessPlayer> { 
    // getPlayer now needs to return a ChessPlayer, hopefully without casting 
}