如何使用类名称将对象添加到数组,然后调用它们的任何方法?

时间:2013-07-20 11:40:49

标签: java casting arraylist type-conversion converter

我正在尝试使用他们的类名将卡添加到列表中,然后我想调用他们的一个方法。我怎样才能做到这一点?我现在有这个:

进入超级卡:

public static ArrayList<Object> CreateAllCards() throws ClassNotFoundException
    {
        ArrayList<Object> cardArray = new ArrayList<>();

        for (int n = 0; n<cardList.length; n++)
        {
            if (isCardAllowedToBeCreated[n])
            {
                Class card = Class.forName(cardList[n]);
                cardArray.add(card);
            }
        }

        return cardArray;
    }

    static String[] cardList = {
        "CrtAbyssalSpecter",
        "CrtAirElemental",
        "ArtAladdinsRing",
        "SorAmbitionsCost",
        "CrtAnabaShaman",
        "CrtAngelOfMercy",
        "CrtAngelicPage",
        //...
    };
}

其他地方,我的主要:

public static void main(String[] args) throws ClassNotFoundException {

    ArrayList<Object> cardList = Card.CreateAllCards();

    for (int n=0; n<cardList.size(); n++)
    {
        if (cardList.get(n) instanceof Creature)
        {
            // How to call a specific method?
        }
    }

}

另外,有没有办法通过使用每个卡片名称直接创建卡片的arraylist而不是像我一样创建对象的arraylist(按每个卡片名称)?

2 个答案:

答案 0 :(得分:2)

您正在使用表示类的对象填充列表;你不是在创造它们的对象。要创建对象call the newInstance method

            Class card = Class.forName(cardList[n]);
            // Create object by calling the default no-arg constructor:
            cardArray.add(card.newInstance());

之后,您可以通过强制转换来调用特定方法,就像其他答案已经建议的那样:

    if (cardList.get(n) instanceof Creature)
    {
        Creature c = (Creature) cardList.get(n);
        c.creatureSpecificMethod();
    }

虽然可能有更好,更灵活,面向对象的方法。这些“卡”对象有没有共同之处?如果他们这样做,他们可能应该实现相同的接口或从同一个超类继承,并且检查“如果当前的卡是生物卡,那么X”可以保持在最低限度。请参阅 "Prefer Polymorphism Over InstanceOf and Downcasting."

<强>更新

要创建Cards列表,您需要进行以下修改:首先将列表声明为Card列表:

ArrayList<Card> cardArray = new ArrayList<>();

然后使用asSubclass方法将forName的结果“强制转换”为Card的子类:

Class<? extends Card> card = Class.forName(cardList[n]).asSubclass(Card.class);
cardArray.add(card.newInstance());

答案 1 :(得分:2)

使用强制转换,如下所示:

public static void main(String[] args) throws ClassNotFoundException
{

    ArrayList<Object> cardList = Card.CreateAllCards();

    for(Object card : cardList)
    {
        if(card instanceof Creature)
        {
            Creature creature = (Creature) card;
            creature.creatureMethod();
        }
    }
}

此外,我将您的for循环样式更改为效率更高的for each