gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:46:08 26 4
gpt4 key购买 nike

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

进入父类(super class)卡:

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?
}
}

}

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

最佳答案

您正在用代表类的对象填充列表;您没有创建它们的对象。创建对象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();
}

不过可能有更好、更灵活、面向对象的方法。难道这些“卡片”对象没有什么共同点吗?如果他们这样做,他们可能应该实现相同的接口(interface)或从相同的父类(super class)继承,并且诸如“当前卡是否是生物卡做X”之类的检查可以保持在最低限度。请参阅"Prefer Polymorphism Over InstanceOf and Downcasting."

更新:

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

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

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

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

关于java - 如何使用对象的类名将对象添加到数组,然后调用它们的任何方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17761875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com