随机实例化派生类

时间:2016-09-14 23:20:40

标签: java android random polymorphism

我有一个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);
}

5 个答案:

答案 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());