Java指的是未初始化的类

时间:2013-10-24 20:17:16

标签: java variables casting

我有一个包含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>>>

那么我应该如何将我的卡片投射到特定的子类?

3 个答案:

答案 0 :(得分:1)

添加名为CardType的新枚举,其值为AssassinFighter等,然后为您的卡片组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 ...

但这看起来很奇怪。我不知道你想要完成什么,但我认为你需要更好地理解如何使用继承(或澄清你想做什么)。