使用instanceof和HashMap执行双命令

时间:2014-12-19 02:59:09

标签: java

我真的对此感到茫然。在为每个子类管理单独的HashMaps时遇到一些问题后,我决定尝试使用instanceof使用Parent类的HashMap使事情变得更简单,该类包含任意数量的每个子类。我想出了这个测试代码:

static  HashMap <Integer, ant> antMap = new HashMap();

public static void main(String[] args) {
    // ant is parent to antF, antSo, and antB
    ant testSc = new ant();
    antF testF = new antF();
    antSo testS = new antSo();
    antB testB = new antB();

    antMap.put(testSc.ID, testSc);
    antMap.put(testF.ID, testF);
    antMap.put(testS.ID, testS);
    antMap.put(testB.ID, testB);
    ant grand = new ant();
    int loop = 0;

    for (int s = 1; s < 5; s++){
        grand = antMap.get(s);
        loop++;
        if(grand instanceof ant){
            System.out.println("type " + grand.type + grand.ID + "Loop " + loop);
        }
        if(grand instanceof antF){
            antF work = (antF) grand;
            System.out.println("type " +  work.type + work.ID + "Loop " + loop);
        }
        if(grand instanceof antSo){
            System.out.println("type " + grand.type + grand.ID + "Loop " + loop);
        }
        if(grand instanceof antB){
            System.out.println("type " + grand.type + grand.ID + "Loop " + loop);
        }
    }

我把循环计数器放在那里,看看for循环是否以某种方式加倍但输出是:

type Scout1Loop 1
type Forager2Loop 2
type Forager2Loop 2
type Soldier3Loop 3
type Soldier3Loop 3
type Bala4Loop 4
type Bala4Loop 4

我看到父类(此处标记为scout)正确执行一次。 ant中的构造函数类根据蚂蚁的数量分配一个ID,因此Forager应该是Forager2,Soldier应该是Soldier3等。

我不能为我的生活弄清楚为什么子类正在执行两次。循环计数器显示了这一点。

有人有任何建议吗?

编辑:你可以看到我在for循环中尝试了几个不同的东西来获得预期的结果。)

(我确实尝试将其标记为作业,尽管这不是特定的解决方案。)

2 个答案:

答案 0 :(得分:1)

获得所见输出的一种方法是让antFantSoandB都扩展到类ant。在这种情况下,当grand是类antF的实例时,以下两个if-s都将返回true:grand instanceof antgrand instanceof antF

解决此问题的一种简单方法是将最后3 if - s更改为else if - s,或将continue添加到每个if块中。

答案 1 :(得分:0)

这里的问题是你的课程扩展ant。请记住,扩展几乎意味着&#34;是一个&#34;。例如:public class Dog extends Animal表示狗&#34;是&#34;动物

鉴于此,它将始终执行第一个if语句,然后执行正确的语句。要解决此问题,请将整个事件设为一个大的if-else语句,并将if grand instanceof ant作为最后一个语句。就这样......

if(grand instanceof antF){
    antF work = (antF) grand;
    System.out.println("type " +  work.type + work.ID + "Loop " + loop);
}else if(grand instanceof antSo){
    System.out.println("type " + grand.type + grand.ID + "Loop " + loop);
}else if(grand instanceof antB){
    System.out.println("type " + grand.type + grand.ID + "Loop " + loop);
}else if(grand instanceof ant){
    System.out.println("type " + grand.type + grand.ID + "Loop " + loop);
}