从Java中的一堆类中随机选择

时间:2011-07-12 13:45:18

标签: java inheritance

我在Java中有一个最好的技术问题。我有一个实现一些genral方法的基类。一堆继承的类。现在我必须随机选择一个继承的类。我的方法如下:

  1. 为每个继承的类
  2. 创建 Class 对象的数组
  3. 随机生成数组的索引
  4. 使用 newInstance()
  5. 在2.的随机索引处创建对象的实例

    第1步的代码示例:

    Class[] possibleClasses = {Class1.class, Class2.class}

    这是一个充分的方法吗?例如,Eclipse Indigo语法更正对于上面的代码示例说“类是原始类型。对泛型类的引用应该参数化”。那么没有泛型的定义可能会有副作用吗?

    的Stefan

4 个答案:

答案 0 :(得分:2)

你的方法很好 - 实际上它可能是最简单和最有效的方法。

如果要避免编译器警告,可以按如下方式添加泛型类型参数:

Class<?>[] possibleClasses = new Class[]{Class1.class, Class2.class}

然而,这只是给你一个不同的警告(未经检查的转换),所以你不妨直接压制原始警告。

稍微复杂的替代方法是使用反射来遍历类层次结构,并自动将基类的所有子类添加到类的ArrayList中。优点是您不需要单独显式列出所有子类,它会自动选择添加的任何新子类。

答案 1 :(得分:2)

由于没有人将此作为答案,我会说:使用List。数组与泛型类型不匹配。

List<Class<? extends MyBaseClass>> possibleClasses = Arrays.asList(Class1.class, Class2.class);

在Java 7之前,这将产生无害的警告:

Unchecked generics array creation for varargs parameter.

可以安全地忽略或抑制它,或者你可以这样做:

List<Class<? extends MyBaseClass>> possibleClasses = new ArrayList<...>();
possibleClasses.add(Class1.class);
//...

然后您可以生成随机索引并使用possibleClasses.get(i)

答案 2 :(得分:1)

Class<? extends Collection>[] klazzes =
  (Class<Collection>[]) new Class[]{ List.class, Set.class };

答案 3 :(得分:0)

好的,人们似乎很难想出代码。你应该这样做:

Class<?>[] cls = {Class1.class, Class2.class};
Random r = new Random();
Class<?> = cls[r.nextInt(cls.length)];

您应该在调用中重用Random实例来确保分发。