【问题标题】:How can I determine the type of object an ArrayList iterator will return next?如何确定 ArrayList 迭代器接下来将返回的对象类型?
【发布时间】: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... 
}

谢谢

【问题讨论】:

    标签: java iterator arraylist


    【解决方案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) // ...
            

            【讨论】:

              猜你喜欢
              • 2014-02-02
              • 2011-05-17
              • 2020-04-28
              • 1970-01-01
              • 2013-09-23
              • 1970-01-01
              • 2019-06-03
              • 2020-07-03
              • 2013-01-18
              相关资源
              最近更新 更多