2013-08-22 52 views
0

我试图让一个游戏的维护方法,我的朋友和我正在努力,基本上检查的子弹是设置边界之外,然后从一个ArrayList(活着)到另一个(死亡)。试图编辑通过WIldcard传递ArrayLists

我们有许多ArrayLists,包含从Bullet_Enemy类扩展的不同类型的项目符号。

维护类如下(使用Java):

public void maintenance(ArrayList<? extends Bullet_Enemy> aliveList, ArrayList<? extends Bullet_Enemy> deadList) 
{ for(i = 0; i < aliveList.size(); i++) 
    { if(aliveList.get(i).[Position] [is] [outside Boundary]) 
      {  deadList.add(aliveList.get(i)); 
       aliveList.get(i).reset(); 
       aliveList.remove(i); 
      } 
     } 
} 

时遇到的问题是,在该行 “deadList.add(aliveList.get(I));”告诉我,有一个错误:

"The method add(capture#33-of ? extends Bullet_Enemy) in the type ArrayList<capture#33-of ? extends Bullet_Enemy> is not applicable for the arguments (capture#34-of ? extends Bullet_Enemy)" 

我真的不知道从哪里甚至开始对这个问题 - 甚至什么条件来搜索周围的谷歌将是有益的,因为有人会解释为什么这个问题发生。

谢谢!

回答

0

问题是两个?不能保证是相同的类型。

所以你可以有ArrayList<Bullet_Enemy_SubClass1>ArrayList<Bullet_Enemy_SubClass2>作为你的参数,但显然Bullet_Enemy_SubClass1Bullet_Enemy_SubClass2是不兼容的。

假设你很高兴,他们必须是同一类型,你可以通过方法签名解决这个问题:

public <T extends Bullet_Enemy> void maintenance(ArrayList<T> aliveList, 
               ArrayList<T> deadList) 

但似乎你真的要允许任何Bullet_Enemy类型的ArrayList小号(每一个这些不局限于单一类型),在这种情况下,你应该使用ArrayList<Bullet_Enemy>

public void maintenance(ArrayList<Bullet_Enemy> aliveList, 
         ArrayList<Bullet_Enemy> deadList) 

这将仍然允许添加Bullet_Enemy_SubClass1Bullet_Enemy_SubClass2ArrayList个S,你就得投他们,如果你想使用的Bullet_Enemy_SubClass1Bullet_Enemy_SubClass2的方法,即:

((Bullet_Enemy_SubClass1)aliveList.get(0)).subClass1Method(); 

// cast not required if we want to use a method of Bullet_Enemy 
aliveList.get(0).bulletEnemyMethod(); 
+0

谢谢,完美无缺! 我最终使用第一种方法,因为第二种方法基本上是我刚刚切换的(基本上我无法传递ArrayList ,因为虽然Bullet_Enemy_Subclass1扩展了Bullet_Enemy,但Bullet_Enemy_Subclass1的ArrayList没有扩展ArrayList Bullet_Enemy或者其他一些,现在一切都很好,谢谢! – B10HAzARD