Как я могу определить тип объекта, который итератор ArrayList возвратит затем?

Я имею ArrayList и я использую итератор для пробежки его. Я должен узнать, какой объект является следующим:

Iterator vehicleIterator = vehicleArrayList.iterator();

while(vehicleIterator.hasNext())
{
     //How do I find the type of object in the arraylist at this point
     // for example, is it a car, bus etc... 
}

Спасибо

9
задан Shog9 1 February 2010 в 00:01
поделиться

6 ответов

Object o = vehicleIterator.next();
if (o instanceof Car) // Is a car
if (o instanceof Bus) // ...
9
ответ дан 4 December 2019 в 08:33
поделиться

Дженерики могут здесь очень помочь. Затем вы можете использовать instanceof для определения автомобиля автобуса.

0
ответ дан 4 December 2019 в 08:33
поделиться

Одним из способов является использование метода getClass().

Object obj = vehicleIterator.next();
Class type = obj.getClass();  
System.out.println("The type is: " + type.getName());

Однако, если вы явно проверяете тип класса, то почти всегда есть лучший способ написать свой код, используя полиморфизм или какой-то другой принцип ОО. Код, который проверяет тип, как этот, или используя instanceof, безусловно, придется изменить, если добавить дополнительные типы машин.

Не имея дополнительной информации о том, что вы делаете с этим типом, я бы предложил вам иметь базовый тип Транспортное средство , от которого Автомобиль , Шина и т.д. все унаследовано. Дайте вашим транспортным средствам необходимые методы (переопределите те, которые вам нужны), а затем просто вызовите эти методы в цикле.

5
ответ дан 4 December 2019 в 08:33
поделиться

Вы всегда можете использовать getClass() в случае, если вы точно не знаете, чего ожидать.

0
ответ дан 4 December 2019 в 08:33
поделиться

Поскольку вы хотите, чтобы класс следующего элемента , а не текущего, рассмотрите возможность использования реализации подглядывающего итератора .

Тогда можно использовать условие цикла типа:

while (vehicleIterator.hasNext() &&
       ForkLiftTruck.class.isAssignableFrom(vehicleIterator.peek().getClass())) {
    vehicle forkLiftTruck = (ForkLiftTruck) vehicleIterator.next();
    // ...
}
2
ответ дан 4 December 2019 в 08:33
поделиться

Во-первых, принесите туда дженерики. Они используются в Java с 2004 года. Даже версия Java SE, в которой они были представлены, завершила свой срок службы.

(Как указывает @finnw, я забыл о старой плохой Java ME. Если вам нужно использовать Java ME, тогда вам нужно будет избегать обобщения и приводить (но не instanceof часто), пока он ( включая развернутые устройства) до 2004 года.)

Использование instanceof и приведение обычно указывает на плохой дизайн. Вероятно, было бы лучше поместить в список объект с интерфейсом, который клиентский код может использовать без тестов, и реализации, которые отображают различное поведение для каждой «реальной» цели списка. «Любую проблему в информатике можно решить, добавив еще один уровень косвенного обращения» [«... за исключением слишком большого количества уровней косвенного обращения».]

9
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: