Java 使用迭代器遍历ArrayList并使用instanceof设置对象

Java 使用迭代器遍历ArrayList并使用instanceof设置对象,java,arraylist,iterator,Java,Arraylist,Iterator,我有一个对象的ArrayList和一个遍历它们的迭代器。我试图在列表中找到Ant对象的实例,并将其分配给Ant变量 while(iterator.hasNext()) { if(iterator.getNext() instanceof Ant) { Ant ant = (Ant)iterator.getNext(); } } 由于iterator.getNext()在调用时递增迭代器,因此上面的代码将ant后面的对象分配给ant变量。我想知道如何将列表中的An

我有一个对象的ArrayList和一个遍历它们的迭代器。我试图在列表中找到Ant对象的实例,并将其分配给Ant变量

while(iterator.hasNext()) {
    if(iterator.getNext() instanceof Ant) {
        Ant ant = (Ant)iterator.getNext();
    }
}

由于iterator.getNext()在调用时递增迭代器,因此上面的代码将ant后面的对象分配给ant变量。我想知道如何将列表中的Ant对象正确地分配给Ant变量。

您调用了两次
.getNext()
,因此您实际上是在检查对象之后强制转换对象

while(iterator.hasNext()) {
    if(iterator.getNext() instanceof Ant) {
        Ant ant = (Ant)iterator.getNext();
    }
}
试试这个:

while(iterator.hasNext()) {
  Object obj = iterator.next();
  if (obj instanceof Ant) {
    Ant ant = (Ant)obj;
  }
}

还要注意的是,在迭代器中检索底层对象是
.next()
而不是
.getNext()

之所以发生这种情况,是因为您调用了
迭代器.getNext()
两次:第一次是在条件中,然后是在条件体中,所以您错过了第一个值,然后尝试第二次调用Ant类型。你需要像这样的代码

while(iterator.hasNext()) {
            Object obj = null; 
            if((obj = iterator.getNext()) instanceof Ant) {
                Ant ant = (Ant)obj;
            }
} 
的重复答案,其中包含有效代码(未定义方法
getNext()
),以及不使用内联赋值的可读性更强的代码。