java 试图从超类列表中获取特定子类的列表

pftdvrlh  于 12个月前  发布在  Java
关注(0)|答案(1)|浏览(85)

我无法导入任何类。我试图创建一个方法,该方法在Unit[]类型的示例上调用,该方法名为ListOfUnits,具有私有字段(Unit[] units)(int size)。units是数组,其大小用于记录数组中有多少个元素。MilitaryUnit是Unit的一个子类。军事单位只有两种子类:弓箭手和战士。单位也包括其他与MilitaryUnit无关的子类。调用该方法时,应返回示例列表中仅包含MilitaryUnit的列表MilitaryUnit[]。
有人能解释一下我做错了什么吗?我的军队列表不应包含任何空元素

public class ListOfUnits {
  private Unit[] Units;
  private int size;

  public ListOfUnits() {
    this.Units = new Unit[1];
    this.size = 0;
  }

  public MilitaryUnit[] getArmy() {
    int newsize = 0;
    for (int i = 0; i < this.size; i++) {
      if (this.Units[i] instanceof MilitaryUnit) {
        newsize++;
      }
    }
    MilitaryUnit[] newlist = new MilitaryUnit[newsize];
    int b = 0;
    for (int h = 0; h < this.size; h++) {
      if (this.Units[h] instanceof MilitaryUnit) {
        newlist[b] = (MilitaryUnit) this.Units[h];
        b++;
      }
    }

    return newlist;
  }
}
lyr7nygr

lyr7nygr1#

为什么在构造函数中创建new Unit[1],但将size赋值为0?它应该是size 1或Unit[0],所以它可以组合在一起。此外,将大小保存在单独的变量中是不必要的。只需使用Units.length,或者将字段重命名为小写(大写用于类名)并将其称为units.length
如果数组是不可更改的,则可以将其声明为final。或者,如果它的大小发生了变化,可以使用ListSet这样的集合。
无论如何,如果你这么喜欢数组,这里有一个保留数组方法的变体,但有一个精简的getArmy()方法:

import java.util.Arrays;

public class ListOfUnits {
  private Unit[] units;

  public ListOfUnits(Unit... units) {
    this.units = units;
  }

  public MilitaryUnit[] getArmy() {
    return Arrays.stream(units)
      .filter(unit -> unit instanceof MilitaryUnit)
      .toArray(MilitaryUnit[]::new);
  }

  public static void main(String[] args) {
    ListOfUnits listOfUnits = new ListOfUnits(
      new Unit(), new MilitaryUnit(), new Archer(), new Warrior(),
      new Unit(), new MilitaryUnit(), new Archer(), new Warrior()
    );
    MilitaryUnit[] army = listOfUnits.getArmy();
    System.out.println(army.length + " -> " + Arrays.toString(army));
    assert army.length == 6 : "unexpected army size";
  }

  static class Unit {}
  static class MilitaryUnit extends Unit {}
  static class Archer extends MilitaryUnit {}
  static class Warrior extends MilitaryUnit {}

}

P.S.:类名ListOfUnits不仅是误导性的,因为它 Package 了一个数组,而不是一个列表,而且在类名中放置值类型也不好。为什么不是Units?实际上,我想知道这样的类是否合理,因为它似乎没有做任何常规集合或数组以及getArmy()在应用程序类中所做的过滤和类型转换的工具方法所不能做的事情。但这不在我们的讨论范围内。

相关问题