Java List包含不同子类的List

时间:2016-08-26 09:16:57

标签: java list inheritance arraylist subclass

我有一个Animal类,它由子类DuckCow(以及更多)扩展。我正在制作一个AnimalManager课程来处理我的动物和其他课程之间的互动。

我正在尝试列出包含不同Animal子类的列表: AnimalManager类中的List<List<differentSubclass>

实施例: 包含100只鸭子清单,100头奶牛清单,50只大猩猩清单等的清单

创建此列表列表的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

使用关联map&gt;的class class

的动物名单
Map<Class<? extends Animal>, List<? extends Animal>> map

此声明允许您:

map.put(Duck.class, new ArrayList<Duck>())

答案 1 :(得分:-1)

如果您之前知道列表列表的大小,我建议您使用简单的表格。那么@xenteros会回答你更有效率和速度。这将是:

private static final int DUCKS = 0;
private static final int COWS = 1;
private static final int GORILLAS = 2;

private List<Animal>[] myAnimals = (List<Animal>[]) new List<?>[3]; // You know the size.

List<Duck> ducks = new ArrayList<>();
List<Cow> cows = new ArrayList<>();
List<Gorilla> gorillas = new ArrayList<>();

myAnimals[DUCKS] = ducks;
myAnimals[COWS] = cows;
myAnimals[GORILLAS] = gorillas;

此解决方案是您可以实施的最快的解决方案,但您必须关心索引值才能使其正常工作。正如@xenteros所说,你正在签订一份必须遵守的合同。但是使用常量DUCKCOWSGORILLAS这很容易;)

编辑:更好的方法是使用Enum,因为@Sergey Rybalkin建议管理动物的类型,所以如果它们长大,你会得到400种动物使用Enum会更灵活。它会是这样的:

private enum Animals {
    DUCKS,
    COWS,
    GORILLAS; 
}

private List<Animal>[] myAnimals = (List<Animal>[]) new List<?>[Animals.values().length]; // You can get the length of your enum.

List<Duck> ducks = new ArrayList<>();
List<Cow> cows = new ArrayList<>();
List<Gorilla> gorillas = new ArrayList<>();

myAnimals[Animals.DUCKS.ordinal()] = ducks;
myAnimals[Animals.COWS.ordinal()] = cows;
myAnimals[Animals.GORILLAS.ordinal()] = gorillas;

ordinal方法为您提供已定义枚举常量的值位置。在这种情况下,Animal.DUCKS.ordinal()为您提供0,Animal.COWS.ordinal()为您提供1 ... java doc

中的更多信息
  

返回此枚举常量的序数(它在其中的位置)   枚举声明,其中初始常量被赋值为序数   零)。