如何将不同的内部 类 添加到 ArrayList?

How do I add different inner classes to an ArrayList?

因此,我正在构建一个基于 Warhammer 40k 桌面游戏的非常基础的程序,作为我的 Comp Sci class 的额外学分分配。我开始制定规范,然后实施规范。在这个游戏中,我有一支 class 军队,它有一个 class 单位的 ArrayList:

List<Units> unitsList = new ArrayList<Units>();

我创建了 class 个单元,内部 class 包含不同的单元类型。因此,其中的代码片段将是:

public class Units 
{
   int strength, toughness, attacks, save, wounds;
   class TroopUnit
   {
      public static final int strength = 3;
      public static final int toughness = 3;
      public static final int attacks = 1;
      public static final int save = 5;

      public int wounds = 1;
   }

   class EliteTroopUnit
   {
      public static final int strength = 3;
      public static final int toughness = 3;
      public static final int attacks = 1;
      public static final int save = 4;

      public int wounds = 1;
   }

}

还有更多的单位类型,但我想你应该明白了。我尝试在 Units ArrayList:

中添加这些不同的内部 classes Units
public Army(int troopPoints, int eliteTroopPoints, int commandPoints,
     int commandTroopPoints, int fastAttackPoints, int heavyAttackPoints)
{      
   for (int i = 0; i < (troopPoints/TROOP_COST); i++)
      if (troopPoints % TROOP_COST == 0) 
      {
         if (points < MAX_POINTS) 
         {
            unitsList.add(new Units.TroopUnit());
            points += TROOP_COST;
            numUnits++;
         }
      }
   for (int i = 0; i < (eliteTroopPoints/ELITE_TROOP_COST); i++)
      if (eliteTroopPoints % ELITE_TROOP_COST == 0) 
      {
         if (points < MAX_POINTS) 
         {
            unitsList.add(new Units.EliteTroopUnit());
            points += ELITE_TROOP_COST;
            numUnits++;
         }
      }
}

但是,我 运行 遇到了问题,因为我必须使用特定类型的 innerclass 声明和实例化 ArrayList,以便向其添加内部 class .例如, List<Units.someUnitInnerClass> unitsList = new ArrayList<Units.someUnitInnerClass();

那么,是否有解决此问题的方法,我可以将任何内部 classes 添加到 ArrayList?我是否错误地解决了这个问题?如果是这样,还有哪些其他选择?谢谢!

编辑:我最初将其列为“如何向 ArrayList 添加不同的子 classes,但这是一个错误(由 Rudi Kershaw 更正)。

在您提供的示例代码中,TroopUnitEliteTroopUnit而非 Unit的子类型。他们是 inner classes.

如果您希望它们成为 Unit 的子class,它们需要扩展 Unit。例如;

public class Unit {}
public class TroopUnit extends Unit {}

在上面的示例中,TroopUnit 扩展(因此是 Unit 的子class)。快速浏览一下,您似乎只需将 extends Unit 添加到内部 class 声明的末尾,它就会按照您的预期进行。

希望对您有所帮助。

参考资料和进一步阅读:

首先,subclass 应该扩展 class。像这样:

public class TroopUnit extends Units{}

其次,回答你的标题问题,这与你的代码问题无关,你应该在层次结构中得到一个 class 比你添加到列表中的 object ,并且因为 java Object 是所有 类 中的 parent 那么你可以像这样实例化你的列表:

List<Object> unitsList = new ArrayList<Object>();