如何创建一个类的ArrayList?

8

我有一些类(CarMotorcycleTrain等),它们都是从Vehicle类继承而来的。 从另一个类中,我需要创建一个ArrayList,只能访问包含在该ArrayList中的类。

这个概念类似于这个,但显然它不起作用;

ArrayList<Class> vehicleType=new ArrayList<Class>();
vehicleType.add(Class.forName("train"));

如何解决这个问题?谢谢。

2
这应该没有任何问题。你有收到任何错误信息吗? - millimoose
Class.forName("Train") 可能吗?区分大小写吗? - Salvatore Previti
2
我不熟悉Java,但是ArrayList<Vehicle>是否符合您的需求? - Mooing Duck
嗯,我不想做一个车辆数组。我的想法是做一个类的ArrayList。在另一个类的方法中,我将只使用该数组中包含的类。 - Fischer
1
警告不是问题。要使其实际工作,请遵循Dave的答案。我猜你收到的警告是关于未参数化的类引用。使用这个:ArrayList<Class<? extends Vehicle>> - G_H
显示剩余3条评论
5个回答

11

大多数答案遵循您使用 Class.forName() 的建议,尽管这并不必要。您可以在类型名称上“调用”.class

看看这个JUnit测试:

@Test
public void testListOfClasses() {

    List<Class<?>> classList = new ArrayList<Class<?>>();

    classList.add(Integer.class);
    classList.add(String.class);
    classList.add(Double.class);

    assertTrue("List contains Integer class", classList.contains(Integer.class));
}
我会为你的需求准备一个类型为Class<? extends Vehicle>的列表。

3

如果您要使用类加载器 (Class.forName),您需要使用完全限定的类名,即 Class.forName("com.package.Train");,就像您从命令行引用它一样。


2

尝试:

ArrayList<Class<? extends Vehicle>> vehicleType=new ArrayList<? extends Vehicle>();
vehicleType.add(Train.class);

这将确保添加到 vehicleType 的所有类都会扩展 Vehicle 。并且,类 Train 实际存在。

很少需要以这种方式使用类。尝试找到更简单的解决问题的方法。


1

Class.forName("Train") 也许是这样吗?区分大小写吗?


0
如果“train”是简单类名,那么这将完成工作。

vehicleType.add(Class.forName(train.class.getName()));

无论如何,如果您不告诉我们错误(或异常)信息,我们就无法提供更进一步的帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接