Java使用带有迭代器的instanceof

时间:2016-07-04 15:55:25

标签: java iterator polymorphism instanceof

我有一个抽象类Usuario和一个ArrayList<Usuario>,其中包含三个子类的对象。我现在想要遍历ArrayList并根据对该对象使用instanceof的结果返回一个值。

我收到错误:java.util.NoSuchElementException

我想这是因为迭代器是Iterator的对象而不是来自Usuario的任何子类。我对吗?那有什么解决方案吗?

public int comprobarDni(String dniAComprobar, ArrayList<Usuario> listaUsuarios) {
    Iterator<Usuario> itUsuarios = listaUsuarios.iterator();
    while (itUsuarios.hasNext()) {
        if (dniAComprobar.equals(itUsuarios.next().getDni())) {
            if (itUsuarios.next() instanceof UsuarioBiblioteca) {
                return 1;
            } else if (itUsuarios.next() instanceof Bibliotecario) {
                return 2;
            } else if (itUsuarios.next() instanceof BibliotecaExterna) {
                return 3;
            }
        }
    }
    return 0;
}

3 个答案:

答案 0 :(得分:4)

Iterator.next()返回下一个项目并前进光标。这不是你想要的,所以试试这个:

Usuario usuario = itUsuarios.next();
...

if (usuario instanceof UsuarioBiblioteca) {
  return 1;
} else if (usuario instanceof Bibliotecario) {
   return 2;
} else if (usuario instanceof BibliotecaExterna) {
  return 3;
}

使用您的代码考虑以下情况:listaUsuarios仅包含两个类型为BibliotecaExterna的元素。您对next()的第一次调用将返回第一个元素,但由于类型不匹配,您发出第二次调用next(),返回第二个元素。再次类型不匹配,因此您发出第三次调用next()itUsuarios.next() instanceof BibliotecaExterna)但没有第三个元素,因此您将获得{{1} }。

答案 1 :(得分:2)

您在迭代期间多次调用itUsuarios.next

因此,当List已经完全迭代时,你可能最终会调用它,这会抛出java.util.NoSuchElementException

考虑分配一次Usuario值,并改为引用它:

while (itUsuarios.hasNext()) {
  // reference this instead of itUsuarios.nex() for next references
  Usuario usuario = itUsuarios.next(); 

或...

快速枚举以获得更清晰的代码:

for (Usuario usuario: listaUsuarios) {
    ...

答案 2 :(得分:0)

您的代码中存在一个巨大的误解:

如果您当前的元素是next()的实例,则会在第一个 if语句中调用UsuarioBiblioteca,并针对Usuario element = itUsuarios.next(); if(element instance of ...) ... 进行检查。但是元素已经发生了变化。

而是将其存储在开头:

$repository->createQueryBuilder('i')
    ->innerJoin('i.courses','c')
    ->where('i.active = TRUE')
    ->andWhere('i.verified = TRUE')
    ->orderBy('i.name', 'ASC');