Как создать ArrayList Классов? - PullRequest
8 голосов
/ 25 октября 2011

У меня есть несколько классов (Car, Motorcycle, Train ... и т. Д.), Которые простираются от class Vehicle.Из другого класса мне нужно создать ArrayList классов для доступа только к тем, которые включают ArrayList.

Концепция похожа на это, но, очевидно, она не работает;

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

Как я могу решить это?Спасибо

Ответы [ 5 ]

10 голосов
/ 25 октября 2011

Большинство ответов следуют вашему предложению использовать 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 голосов
/ 25 октября 2011

Если вы собираетесь использовать загрузчик классов (Class.forName), вам нужно использовать полное имя класса, т.е. Class.forName("com.package.Train");, точно так же, как вы бы ссылались на него из командной строки.

2 голосов
/ 25 октября 2011

Попробуйте:

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

Он будет следить за тем, чтобы все классы, добавленные в vehicleType, расширялись Vehicle. И этот класс Train действительно существует.

Редко необходимо использовать классы таким образом. Попробуйте найти более простой способ решения вашей проблемы.

1 голос
/ 25 октября 2011

Class.forName ("Поезд") возможно?Чувствительный к регистру?

0 голосов
/ 25 октября 2011

Если "train" - это простое имя класса, то это сделает работу

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

В любом случае, пока вы не сообщите нам, что это за сообщение об ошибке (или исключении), мы не можем помочь в дальнейшем.

...