Как определить тип объекта, который итератор ArrayList вернет следующим? - PullRequest
9 голосов
/ 01 февраля 2010

У меня есть 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... 
}

Спасибо

Ответы [ 6 ]

9 голосов
/ 01 февраля 2010

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

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

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

9 голосов
/ 01 февраля 2010
Object o = vehicleIterator.next();
if (o instanceof Car) // Is a car
if (o instanceof Bus) // ...
5 голосов
/ 01 февраля 2010

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

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

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

Не имея больше информации о том, что вы делаете с типом, я бы посоветовал вам иметь базовый тип Vehicle, который Car, Bus и т. Д. Все они наследуют. Дайте вашим транспортным средствам методы, которые им нужны (переопределите те, которые вам нужны), затем просто вызовите эти методы в цикле.

2 голосов
/ 01 февраля 2010

Поскольку вам нужен класс элемента next вместо текущего, рассмотрите возможность использования peeking итератора реализация.

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

while (vehicleIterator.hasNext() &&
       ForkLiftTruck.class.isAssignableFrom(vehicleIterator.peek().getClass())) {
    vehicle forkLiftTruck = (ForkLiftTruck) vehicleIterator.next();
    // ...
}
0 голосов
/ 01 февраля 2010

Generics может оказать здесь большую помощь. Затем вы можете использовать instanceof для определения автомобиля автобуса.

0 голосов
/ 01 февраля 2010

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

...