0

我正在尝试为我的朋友和我正在开发的游戏制作一种维护方法,该方法基本上检查子弹是否超出设定的边界,然后将其从一个 ArrayList(活动)移动到另一个(死)。

我们有许多 ArrayList,包含从 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)"

我不确定从哪里开始解决这个问题 - 即使在谷歌上搜索什么术语也会有所帮助,就像有人解释为什么会发生这个问题一样。

谢谢!

4

1 回答 1

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)

但似乎您确实希望允许sBullet_Enemy中的任何类型ArrayList(而不是将这些类型中的每一个限制为单一类型),在这种情况下您应该使用ArrayList<Bullet_Enemy>

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

这仍然允许添加Bullet_Enemy_SubClass1andBullet_Enemy_SubClass2ArrayLists,如果你想使用Bullet_Enemy_SubClass1or的方法,你只需要转换它们Bullet_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();
于 2013-08-22T11:07:30.077 回答