如何确定 ArrayList 迭代器接下来将返回的对象类型?
Posted
技术标签:
【中文标题】如何确定 ArrayList 迭代器接下来将返回的对象类型?【英文标题】:How can I determine the type of object an ArrayList iterator will return next? 【发布时间】:2011-01-11 13:11:42 【问题描述】:我有一个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...
谢谢
【问题讨论】:
【参考方案1】:首先,在其中获取一些泛型。它们自 2004 年以来一直使用 Java。即使是引入它们的 Java SE 版本也已结束其服务生命周期。
(正如@finnw 指出的那样,我忘记了可怜的旧 Java ME。如果您必须使用 Java ME,那么您将需要避免泛型和强制转换(但不是 instanceof
经常),直到它(包括部署的设备)进入 2004 年。)
使用instanceof
和强制转换往往表明设计不佳。最好将一个对象放入列表中,该对象具有客户端代码无需测试即可使用的接口,以及映射到列表中每个“真实”目标的不同行为的实现。 “计算机科学中的每个问题都可以通过添加另一个间接级别来解决”[“...除了太多的间接级别。”]
【讨论】:
我不知道这个问题,但有时 Java 问题中省略了泛型,因为它们针对的是 j2me(但发帖人忘记将其标记为此类)或家庭作业问题(因为学院避免为教学目的简化语言的泛型。) 另一种可能是他使用的第三方库没有更新泛型。现在几乎所有 Java 开发人员都知道如何创建泛型集合,但并不是每个人都知道使用通配符(例如Iterator<?> myIterator = myLegacyCollection.iterator()
)与遗留代码交互。
@finnw 我确实忘记了可怜的旧 Java ME。 (无论如何,您仍然不想经常使用instanceof
。)【参考方案2】:
Generics 在这里可以提供很大帮助。然后您可以使用instanceof
来确定公交车的汽车。
【讨论】:
【参考方案3】:由于您想要 next 元素的类而不是当前元素的类,请考虑使用 peeking iterator 实现。
然后你可以使用这样的循环条件:
while (vehicleIterator.hasNext() &&
ForkLiftTruck.class.isAssignableFrom(vehicleIterator.peek().getClass()))
vehicle forkLiftTruck = (ForkLiftTruck) vehicleIterator.next();
// ...
【讨论】:
【参考方案4】:一种方法是使用getClass()
方法。
Object obj = vehicleIterator.next();
Class type = obj.getClass();
System.out.println("The type is: " + type.getName());
但是,如果您明确地检查类类型,则几乎总是有更好的方法来使用多态性或其他一些 OO 原则编写代码。如果添加其他类型的汽车,肯定需要更改像这样检查类型或使用instanceof
的代码。
如果没有更多关于你对类型做什么的信息,我建议你有一个基本类型Vehicle
,Car
、Bus
等都继承自。为您的车辆提供所需的方法(覆盖您需要的方法),然后在循环中调用这些方法。
【讨论】:
【参考方案5】:你可以随时使用getClass()
,以防你不知道到底想要什么。
【讨论】:
【参考方案6】:Object o = vehicleIterator.next();
if (o instanceof Car) // Is a car
if (o instanceof Bus) // ...
【讨论】:
以上是关于如何确定 ArrayList 迭代器接下来将返回的对象类型?的主要内容,如果未能解决你的问题,请参考以下文章
设计模式 行为型模式 -- 迭代器模式 JDK源码解析:ArrayList
arraylist 迭代器等于返回 java.util.NoSuchElementException