Я имею 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...
}
Спасибо
Object o = vehicleIterator.next();
if (o instanceof Car) // Is a car
if (o instanceof Bus) // ...
Дженерики могут здесь очень помочь. Затем вы можете использовать instanceof
для определения автомобиля автобуса.
Одним из способов является использование метода getClass()
.
Object obj = vehicleIterator.next();
Class type = obj.getClass();
System.out.println("The type is: " + type.getName());
Однако, если вы явно проверяете тип класса, то почти всегда есть лучший способ написать свой код, используя полиморфизм или какой-то другой принцип ОО. Код, который проверяет тип, как этот, или используя instanceof
, безусловно, придется изменить, если добавить дополнительные типы машин.
Не имея дополнительной информации о том, что вы делаете с этим типом, я бы предложил вам иметь базовый тип Транспортное средство
, от которого Автомобиль
, Шина
и т.д. все унаследовано. Дайте вашим транспортным средствам необходимые методы (переопределите те, которые вам нужны), а затем просто вызовите эти методы в цикле.
Вы всегда можете использовать getClass()
в случае, если вы точно не знаете, чего ожидать.
Поскольку вы хотите, чтобы класс следующего элемента , а не текущего, рассмотрите возможность использования реализации подглядывающего итератора .
Тогда можно использовать условие цикла типа:
while (vehicleIterator.hasNext() &&
ForkLiftTruck.class.isAssignableFrom(vehicleIterator.peek().getClass())) {
vehicle forkLiftTruck = (ForkLiftTruck) vehicleIterator.next();
// ...
}
Во-первых, принесите туда дженерики. Они используются в Java с 2004 года. Даже версия Java SE, в которой они были представлены, завершила свой срок службы.
(Как указывает @finnw, я забыл о старой плохой Java ME. Если вам нужно использовать Java ME, тогда вам нужно будет избегать обобщения и приводить (но не instanceof
часто), пока он ( включая развернутые устройства) до 2004 года.)
Использование instanceof
и приведение обычно указывает на плохой дизайн. Вероятно, было бы лучше поместить в список объект с интерфейсом, который клиентский код может использовать без тестов, и реализации, которые отображают различное поведение для каждой «реальной» цели списка. «Любую проблему в информатике можно решить, добавив еще один уровень косвенного обращения» [«... за исключением слишком большого количества уровней косвенного обращения».]