试图编辑WIldcard传递的ArrayLists

时间:2013-08-22 10:52:23

标签: java wildcard extends

我正在尝试为我的朋友和我正在进行的游戏制作维护方法,基本上检查子弹是否在设定边界之外,然后将其从一个ArrayList(alive)移动到另一个(死)

我们有许多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)"

我不确定从哪里开始解决这个问题 - 即使在Google上搜索哪些条款也会有所帮助,就像有人解释为什么会出现这种问题一样。

谢谢!

1 个答案:

答案 0 :(得分: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_SubClass1添加Bullet_Enemy_SubClass2ArrayList,如果您想使用{{1}的方法,则必须投出它们}或Bullet_Enemy_SubClass1,即:

Bullet_Enemy_SubClass2