Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 随机实例化派生类_Java_Android_Random_Polymorphism - Fatal编程技术网

Java 随机实例化派生类

Java 随机实例化派生类,java,android,random,polymorphism,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

我有一个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);
}
List animalList=new ArrayList();

对于(int i=0;i你可以使用math.random函数生成一个介于1和你有多少个类之间的随机数。然后让每个数字与某个类相关。

你可以使用math.random函数生成一个介于1和你有多少个类之间的随机数。然后让每个数字与某个特定的类相关。

你可以使用math.random函数生成一个介于1和你有多少个类之间的随机数。然后让每个数字与某个特定的类在课堂上。

您可以使用“随机”类以这种方式进行:


通过使用“Random”类,您可以这样做:

只是为了好玩(假设所有动物都有一个无arg构造器,嘘我)

import java.util.ArrayList;
导入java.util.HashSet;
导入java.util.Random;
类动物{
私有静态HashSet house=newhashset();
私有静态随机=新随机();
公共动物(){
Animal.house.add(getClass());
}
public static List party()抛出实例化异常,IllegalAccessException{
如果(house.isEmpty()){
返回null;
}
ArrayList=新建ArrayList();
类别[]类别=(类别[])house.toArray(新类别[0]);
对于(int i=0;i<3;i++){
添加(类[random.nextInt(house.size())].newInstance());
}
退货清单;
}
}
只是为了好玩(假设所有动物都有一个无参数构造函数,嘘我)

import java.util.ArrayList;
导入java.util.HashSet;
导入java.util.Random;
类动物{
私有静态HashSet house=newhashset();
私有静态随机=新随机();
公共动物(){
Animal.house.add(getClass());
}
public static List party()抛出实例化异常,IllegalAccessException{
如果(house.isEmpty()){
返回null;
}
ArrayList=新建ArrayList();
类别[]类别=(类别[])house.toArray(新类别[0]);
对于(int i=0;i<3;i++){
添加(类[random.nextInt(house.size())].newInstance());
}
退货清单;
}
}

如果您感觉精力充沛,可以尝试以下方法:

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());
List构造函数=Arrays.asList(Dog::new、Cat::new、Fish::new、Monkey::new);
列表animalList=new Random()
.ints(3,0,构造函数.size())
.mapToObj(构造函数::get)
.map(供应商::获取)
.collect(Collectors.toList());

如果您感觉精力充沛,可以尝试以下方法:

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());
List构造函数=Arrays.asList(Dog::new、Cat::new、Fish::new、Monkey::new);
列表animalList=new Random()
.ints(3,0,构造函数.size())
.mapToObj(构造函数::get)
.map(供应商::获取)
.collect(Collectors.toList());

如果需要动态发现子类

试试看{
反射反射=新反射(Animal.class.getName()包含(“.”)
?Animal.class.getName().substring(0,Animal.class.getName().indexOf(“.”):Animal.class.getName());

如果需要动态发现子类,请设置

试试看{
反射反射=新反射(Animal.class.getName()包含(“.”)
?Animal.class.getName().substring(0,Animal.class.getName().indexOf(“.”):Animal.class.getName());

设置查看工厂模式。然后创建一个
AnimalFactory
,随机选择一种动物并为您构建它。您可以使用类似的方法获取所有继承人,尤其是使用工厂(正如@justinessner所建议的)要实现这一点,请查看工厂模式。然后创建一个
AnimalFactory
,随机选择一种动物类型并为您构建它。您可以使用类似的方法获取所有继承人,尤其是使用工厂(如@justinessner所建议)来实现这只可怜的猴子!:(还有,可怜的猴子,等等!可怜的猴子!:(还有,poor etc!poor etc!Always Unappeated该问题表示存在多个派生类,但没有给出完整的列表。您的解决方案只考虑一个子集,而且每次添加新的派生类时都需要对其进行修改。(但方法引用捕获/lambda表达式用法的支持)@Tibrogargan问题没有说明它应该自动应用于所有子类型。如果这确实是一个要求,那么它将完成。您链接的问题至少给出了两种方法,这两种方法都不是“几乎不可能的”。可能很贵,但肯定不是不可能。这是如果你想提供所有可用的衍生产品,而不仅仅是满足于加载的衍生产品。如果你编辑问题,我将删除否决票。你使用lambdas确实增加了价值,即使我认为你的解决方案总体上有点不足。我可能错了,@user6388032说它没有呃,它是哪一个派生,等等!总是不被认可这个问题说有几个派生类,并没有给出一个完整的列表。你的解决方案只考虑一个子集,而且每次添加一个新的派生类时都需要修改它。(但是方法引用捕获/lambda表达式用法的道具)@Tibrogargan问题没有说明它应该自动应用于所有子类型。如果这确实是一个要求,那么它将完成。您链接的问题至少给出了两种方法,这两种方法都不是“几乎不可能的”。可能很贵,但肯定不是不可能。这是如果你想提供所有可用的衍生工具,而不仅仅是满足于加载的衍生工具。如果你编辑问题,我将删除否决票。你使用lambdas确实增加了价值,即使我认为你的解决方案总体上有点不足。我可以
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());
    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) {
    }