我正在尝试使用他们的类名将卡添加到列表中,然后我想调用他们的一个方法。我怎样才能做到这一点?我现在有这个:
进入超级卡:
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(按每个卡片名称)?
答案 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
。