我有一个Animal类,它由几个派生类扩展 猴子狗猫鱼等
在我的程序中,我想随机实例化三个派生的动物类,(它与哪个派生无关 - 它们甚至可以允许重复);然后将它们插入列表。我怎样才能做到这一点?
List<Animal> animalList = new ArrayList<>();
for (int i=0;i<3;i++) { Animal animal = new Dog() or new Cat or new Dog()....;
animallist.add(animal);
}
答案 0 :(得分:0)
您可以使用math.random函数生成一个介于1和您拥有的类之间的随机数。然后让每个数字与某个类相关联。
答案 1 :(得分:0)
你可以这样做,使用“随机”类:
int i = new Random().getNext(3);
switch (month) {
case 0: animallist.add(new Dog());
break;
case 1: animallist.add(new Cat());
break;
case 2: animallist.add(new Cow());
break;
}
答案 2 :(得分:0)
只是为了好玩(假设所有动物都没有arg构造函数,请嘘我)
go func()
答案 3 :(得分:0)
如果您需要动态发现子类Reflections
try {
Reflections reflections = new Reflections(Animal.class.getName().contains(".")
? Animal.class.getName().substring(0, Animal.class.getName().indexOf(".")) : Animal.class.getName());
Set<Class<? extends Animal>> subs = reflections.getSubTypesOf(Animal.class);
@SuppressWarnings("unchecked")
Class<? extends Animal>[] subTypes = subs.toArray(new Class[subs.size()]);
if (subTypes != null && subTypes.length > 0) {
List<Animal> list = new ArrayList<Animal>();
Random random = new Random();
for (int i = 0; i < 3; i++) {
list.add(subTypes[random.nextInt(subTypes.length)].newInstance());
}
}
} catch (Exception e) {
}
答案 4 :(得分:-1)
如果您感觉很流氓,可以试试这个:
List<Supplier<Animal>> constructors = Arrays.asList(Dog::new, Cat::new, Fish::new, Monkey::new);
List<Animal> animalList = new Random()
.ints(3, 0, constructors.size())
.mapToObj(constructors::get)
.map(Supplier::get)
.collect(Collectors.toList());