如何确定 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 的代码。

如果没有更多关于你对类型做什么的信息,我建议你有一个基本类型VehicleCarBus 等都继承自。为您的车辆提供所需的方法(覆盖您需要的方法),然后在循环中调用这些方法。

【讨论】:

【参考方案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

关于ArrayList中的iterator返回的事迭代器实例问题。

如何在二叉树中返回迭代遍历的迭代器?

Iterator迭代器

递归迭代和分治:迭代器原理