1

我正在尝试编写代码来遍历类型的集合InstallationComponentSetup

java.util.Collection<InstallationComponentSetup> components= context.getInstallationComponents();
Iterator it = components.iterator();
while (it.hasNext())
{
    if (((InstallationComponentSetup)it).getName() == "ACQ")
    {
         return true;   
    }
}

- 语句中的if强制转换失败,但我真的不知道为什么(我是 C++ 程序员!)。

如果有人能给我一些关于我做错了什么的指示,我将不胜感激。

4

8 回答 8

4

it是一个Iterator,而是it.next()一个InstallationComponentSetup

该错误是由于Iterator无法将 an 强制转换为InstallationComponentSetup.

此外,如果您适当地参数化,您甚至不需要强制转换Iterator

Iterator<InstallationComponentSetup> it = components.iterator();

最后,不要将字符串与类似的东西进行比较a == b,而是使用. 有关详细信息,请参阅“如何比较 Java 中的字符串”a.equals(b)


如果您只想遍历集合,您可能还想查看for-each循环。您的代码可以重写为:

for (InstallationComponentSetup component : components)
    if (component.getName().equals("ACQ"))
        return true;
于 2013-07-08T14:08:15.030 回答
2

如果要比较String,请使用equals()方法。甚至您的转换也是错误的。您必须在迭代器上调用next()才能获取下一个元素。因此it.next(),为您提供下一个将成为 , 的对象的元素InstallationComponentSetupit它不是类型,InstallationComponentSetup因此强制转换将失败。

在这里,您将转换Iterator为您的类类型,这将失败。

if (((InstallationComponentSetup)it).getName() == "ACQ")
{
     return true;   
}

我相信这里不需要强制转换,因为您已经定义了Collection保存特定类型的元素,并且如果您声明Iterator了特定类型的。你可以简单地做:

// define Iterator of InstallationComponentSetup
Iterator<InstallationComponentSetup> it = components.iterator();
if("ACQ".equals(it.next().getName())) {
   return true;
}

for如果您的目的只是读取元素,您也可以考虑使用 Java 中的增强循环。

 for(InstallationComponentSetup component: components) {
      if("ACQ".equals(component.getName())) {
       return true;
   }
 }
于 2013-07-08T14:06:50.850 回答
1

在比较之前,您必须检索迭代中的下一个元素:

InstallationComponentSetup next = it.next();
        if (next.getName() == "ACQ")
        {
             return true;   
        }
于 2013-07-08T14:10:33.693 回答
1

尝试使用以下代码。它更简洁,更容易理解。

Collection<InstallationComponentSetup> components= context.getInstallationComponents();
for(InstallationComponentSetup comp : components){
    if("ACQ".equals(comp.getName()){
        return;
    }
}

我认为您的代码中有两个问题。

  1. 将迭代器强制转换为对象不会那样工作。您需要使用 it.next() 来获取对象并移动迭代器。
  2. 就像已经提到的那样,您需要 equals 来比较字符串。== 比较“内存位置”(用 C++ 术语)。
于 2013-07-08T14:10:44.980 回答
0

install4j API 仍然适用于 Java 1.4,因此还没有泛型。这将起作用:

    for (Object o : context.getInstallationComponents()) {
        InstallationComponentSetup component = (InstallationComponentSetup)o;
        if (component.getName().equals("ACQ")) {
            return true;
        }
    }
于 2013-07-10T07:49:07.517 回答
0

使用foreach循环,使用泛型类型,对 String 使用 equals 并更改字符串比较顺序以null确保安全会更容易。

Collection<InstallationComponentSetup> components= context.getInstallationComponents();
for (InstallationComponentSetup setup : components)
{
    if ("ACQ".equals(setup.getName()))
    {
        return true;   
    }
}
于 2013-07-08T14:09:58.337 回答
0

使用 it.next() 获取下一个元素。

此外,使用 .equals() 方法比较 Java 中的字符串。否则,将比较参考。

最后,类型参数化的迭代器不需要强制转换。

while (it.hasNext())
{
    if ( it.next().getName().equals("ACQ") ) {
       ...
    }
}
于 2013-07-08T14:08:03.567 回答
0

在比较之前,您必须检索迭代中的下一个元素:

java.util.Collection<InstallationComponentSetup> components= context.getInstallationComponents();
Iterator<InstallationComponentSetup> it = components.iterator();
while (it.hasNext()) {
    if ("ACQ".equals(it.next().getName())) {
         return true;   
    }
}
于 2013-07-08T14:08:48.007 回答