如何确定ArrayList迭代器接下来将返回的对象类型?

时间:2010-01-31 23:58:21

标签: java iterator 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... 
}

由于

6 个答案:

答案 0 :(得分:9)

Object o = vehicleIterator.next();
if (o instanceof Car) // Is a car
if (o instanceof Bus) // ...

答案 1 :(得分:9)

首先,在那里获得一些泛型。它们自2004年以来一直在Java中。即使是引入它们的Java SE版本也已完成其服务终止期限。

(正如@finnw指出的那样,我忘记了糟糕的旧Java ME。如果你必须使用Java ME,那么你将需要避开泛型并强制转换(但不经常instanceof)直到它(包括部署)进入2004年。)

使用instanceof并投射往往表明设计不佳。最好将带有接口的对象放入列表中,客户端代码可以在没有测试的情况下使用该接口,以及映射到列表的每个“真实”目标的不同行为的实现。 “计算机科学中的每个问题都可以通过增加另一层次的间接来解决”[“......除了太多的间接层次。”]

答案 2 :(得分:5)

一种方法是使用getClass()方法。

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

但是,如果您明确检查类类型,那么使用多态或其他OO原则编写代码几乎总是更好的方法。如果添加其他类型的汽车,则必须更改这样检查类型或使用instanceof的代码。

如果没有关于您对该类型执行的操作的更多信息,我建议您使用VehicleCar等所有继承自的基本类型Bus。为您的车辆提供他们需要的方法(覆盖您需要的方法),然后在循环中调用这些方法。

答案 3 :(得分:2)

由于您需要 next 元素的类而不是当前元素,请考虑使用peeking iterator实现。

然后你可以使用循环条件,如:

while (vehicleIterator.hasNext() &&
       ForkLiftTruck.class.isAssignableFrom(vehicleIterator.peek().getClass())) {
    vehicle forkLiftTruck = (ForkLiftTruck) vehicleIterator.next();
    // ...
}

答案 4 :(得分:0)

如果您不确切地想要预期,可以随时使用getClass()

答案 5 :(得分:0)

Generics在这里可以提供很大的帮助。然后,您可以使用instanceof来确定公交车。