我有一个Animal
类,它由子类Duck
和Cow
(以及更多)扩展。我正在制作一个AnimalManager
课程来处理我的动物和其他课程之间的互动。
我正在尝试列出包含不同Animal子类的列表:
AnimalManager类中的List<List<differentSubclass>
。
实施例: 包含100只鸭子清单,100头奶牛清单,50只大猩猩清单等的清单
创建此列表列表的最佳方法是什么?
答案 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所说,你正在签订一份必须遵守的合同。但是使用常量DUCK
,COWS
和GORILLAS
这很容易;)
编辑:更好的方法是使用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
返回此枚举常量的序数(它在其中的位置) 枚举声明,其中初始常量被赋值为序数 零)。