我有一个包含6个子类的超类。我有一个带有字符串键和子类集合值的hashmap。我正在定义一个方法,可以将参数作为超类,并将其放入hashmap中的正确集合中。要找到正确的密钥,我使用“istanceof”。现在,当我尝试将超类参数添加到解锁键时,我期望(我实际上无法编译我的程序)编译时错误,因为我还没有投入。我不能让变量引用一个类。据我所知,它需要引用一个对象。我可以参考Class<Subclass>.
但我仍然无法从那里取得进展。
public void addCard(AttackCard card) {
String category = null;
AttackCard type = null; <-- I would like to make this refer to e.g. Assassin
if (card instanceof Assassin) {
category = "assassins";
}if (card instanceof Fighter) {
category = "fighters";
}if (card instanceof Mage) {
category = "mages";
}if (card instanceof Marksman) {
category = "marksmen";
}if (card instanceof Support) {
category = "supports";
}if (card instanceof Tank) {
category = "tanks";
}
attackPool.get(category).get(card.getTier()).add(card)
}
有两点需要注意:
1)子类是抽象的,无法初始化?
2)我的hashmap实际上是HashMap<String, Hashmap<Enum, ArrayList<Subclass>>>
那么我应该如何将我的卡片投射到特定的子类?
答案 0 :(得分:1)
添加名为CardType
的新枚举,其值为Assassin
,Fighter
等,然后为您的卡片组getType()
添加新方法。
class AttackCard{
CardType type;
...
CardType getType(){
return type;
}
}
然后您可以将Map<String, map<Enum, ArrayList<Subclass>>>
更改为Map<CardType, map<Enum, List<AttackCard>>>
attackPool.get(card.getType()).get(card.getTier()).add(card)
在相关的注释中,在类型声明中强制执行Map和List实现是不好的做法,因为之后您将无法更改它并且可能会暴露实现细节。
例如,您应该HashMap<String, Hashmap<Enum, ArrayList<Subclass>>>
而不是Map<String, map<Enum, List<Subclass>>>
。
此外,如果您在地图中的密钥是Enum,那么使用EnumMap
代替HashMap
答案 1 :(得分:1)
鲍里斯很严格。
为了简单起见,只需在AttackCard类中添加addToPool(Map<String, EnumMap <Enum, List<AttackCard >>> pool)
并在每个子类中实现它,以将其自身添加到正确的类别。
这说了一些评论。
施法很少是一个好主意,通常表示设计问题。
我真的没有看到将卡存储在不同子图中的兴趣,因为在检索它时必须将其转换(为了调用子类特定方法)。 (您不能将子图列表键入为子类,而不能仅将整个池限制为此子类。)
如果我是你,我会将池设计为具有List<PeculiarSubclass>
类型的几个属性的对象
否则这与泛型无关,我真的不明白你如何在层次结构的底部有抽象类。只有AttackCard应该是抽象的或接口
答案 2 :(得分:0)
我不确定我理解,但也许这就是你所需要的:
public void addCard(AttackCard card) {
String category = null;
if (card instanceof Assassin) {
category = "assassins";
Assassin type = (Assassin) card;
// Other code using card as Assassin
} else if (card instanceof Fighter) {
category = "fighters";
Fighter type = (Fighter) card;
// Other code using card as Fighter
} else if ...
但这看起来很奇怪。我不知道你想要完成什么,但我认为你需要更好地理解如何使用继承(或澄清你想做什么)。