2015-01-07 108 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 
}