Java 将对象列表从父类强制转换为各种子类的正确方法

Java 将对象列表从父类强制转换为各种子类的正确方法,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我有一个名为Game的基类和多个子类,如NFLGame、NBAGame、NHLGame,等等,在我的代码中,我将这些子对象放在一个数组中,该数组定义为: arraylistgames=newarraylist() 然后阅读阵列中的每一个游戏,我可以想出两种方法来访问它们 使用instanceof()制作一个长if/else if链或一个开关来检查游戏属于哪个子类,然后将其转换为正确的子类 使用哈希表技术,该技术使用分配给每个子类的键id,并且该值是对转换到正确子类的接口方法的调用。我要补充的是,

我有一个名为
Game
的基类和多个子类,如
NFLGame
NBAGame
NHLGame
,等等,在我的代码中,我将这些子对象放在一个数组中,该数组定义为:

arraylistgames=newarraylist()

然后阅读阵列中的每一个游戏,我可以想出两种方法来访问它们

  • 使用
    instanceof()
    制作一个长
    if/else if
    链或一个
    开关来检查游戏属于哪个子类,然后将其转换为正确的子类

  • 使用哈希表技术,该技术使用分配给每个子类的键id,并且该值是对转换到正确子类的接口方法的调用。我要补充的是,这是我目前使用的方法,因为最终我想增加更多的联赛,这将使这成为一个更干净和有效的方法

  • 但我的问题是:当从列表/数组中读取多个子类的对象时,这是唯一可用的两个选项,还是有更好的方法

    编辑:

    根据要求,这是我的游戏课程:

    public abstract class Game
    {
        private String mHomeTeamName, mAwayTeamName, mGameStartTimeLocal, mHomeTeamLogoSrc, mAwayTeamLogoSrc;
        private String mHomeTeamFullName, mAwayTeamFullName;
        private String mHomeTeamRecord, mAwayTeamRecord, mHomeTeamScore, mAwayTeamScore;
        private boolean mGameEnded, mIsGamePostponed, mIsChecked;
        private boolean mWasAddedToCheckedGamesMap;
        private int mLeagueID;
        private String mLeagueName, mGameDateTimeUTC, mGameDateUTC, mGameID;
        private Date mGameDate;
    
        public Game(int leagueID, String leagueName)
        {
            mLeagueID = leagueID;
            mLeagueName = leagueName;
        }
    
        public Game(String homeTeam, String homeTeamFullName, String awayTeam, String awayTeamFullName,
                    String gameStartTimeLocal, String homeTeamRecord, String awayTeamRecord, String homeTeamLogoSrc,
                    String awayTeamLogoSrc, String homeTeamScore, String awayTeamScore, boolean gameEnded,
                    boolean isGamePostponed, String leagueName, int leagueID, Date gameDate,
                    String gameDateTimeUTC, String gameDateUTC)
        {
            mHomeTeamName = homeTeam;
            mAwayTeamName = awayTeam;
            mHomeTeamFullName = homeTeamFullName;
            mAwayTeamFullName = awayTeamFullName;
            mGameStartTimeLocal = gameStartTimeLocal;
            mHomeTeamRecord = homeTeamRecord;
            mAwayTeamRecord = awayTeamRecord;
            mHomeTeamLogoSrc = homeTeamLogoSrc;
            mAwayTeamLogoSrc = awayTeamLogoSrc;
            mHomeTeamScore = homeTeamScore;
            mAwayTeamScore = awayTeamScore;
            mGameEnded = gameEnded;
            mIsGamePostponed = isGamePostponed;
            mLeagueName = leagueName;
            mLeagueID = leagueID;
            mGameDate = gameDate;
            mGameDateUTC = gameDateUTC;
            mGameDateTimeUTC = gameDateTimeUTC;
            mIsChecked = false;
        }
    }
    

    对。您需要的是访问者模式(请参阅)

    其思想是在游戏类中添加一个方法,该方法在每个子类(NBAGame等)中被重写。实现基本上类似于
    visitor.visit(this)

    使用适当的访问方法构建界面
    Visitor
    visit(NHLGame)
    ,等等

    实现
    Visitor
    界面,使每个元素类型都满足您的需要

    然后调用
    accept
    ,让选定的访问者访问集合中的每个元素

    底层机制称为双重分派(见)


    没有投射、没有假设、没有实例。

    一开始,听起来你是从错误的方向(即我们所说的方向)解决问题的。你为什么要这么做?多态性的要点是有一个共享接口,每个类根据自己的逻辑实现相同的方法,所以你甚至不需要强制转换它们。你能在
    Game
    中共享一些方法的实际代码(甚至伪代码)吗?你想让for循环做什么,所以我们有一些具体的讨论?这将有助于我给出一个更清晰的答案。@Mureinik好的,我想我明白你的意思了,但是对于那些具有不同方法的子类,基类不应该实现这些子类呢?离题:你很快就会发现创建一个
    团队
    类也很有用。另一种选择是使用多个列表。如果你(绝对)需要访问每个特定子类型的方法,你不应该含糊其词,把它们放在
    游戏的列表中。谢谢,我将对此进行更多的研究。当您了解该模式时,您将在每次需要概念层次结构和概念集合时使用它。简单。这正是我要找的!它工作得很好。非常感谢。对于阅读本文的任何人,都可以找到一个关于如何实现此模式的非常好的Youtube教程。