我真的对此感到茫然。在为每个子类管理单独的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循环中尝试了几个不同的东西来获得预期的结果。)
(我确实尝试将其标记为作业,尽管这不是特定的解决方案。)
答案 0 :(得分:1)
获得所见输出的一种方法是让antF
,antSo
和andB
都扩展到类ant
。在这种情况下,当grand
是类antF
的实例时,以下两个if-s都将返回true:grand instanceof ant
和grand 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);
}