我有一个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...
}
由于
答案 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
的代码。
如果没有关于您对该类型执行的操作的更多信息,我建议您使用Vehicle
,Car
等所有继承自的基本类型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
来确定公交车。