Java使用instanceof和迭代器

标签 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;
}

最佳答案

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),但没有第三个元素 因此您将得到 NoSuchElementException

关于Java使用instanceof和迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38188584/

相关文章:

java - 如何用复合模式做一个类?

c++ - 实现基于迭代器的 shell 排序

scala - Scala 中的参数或子类型多态性

javascript - java- 是否可以将 javascript 变量传递给 java 函数?

java - 如何从 validate() 方法返回失败状态和失败原因

java - JAXB:XML 注册表中没有与 namespace 和名称匹配的 XML 元素声明

java - 在 Java 中创建对象(继承和多态)

c++ - 克隆一个指针 vector ,我也能以某种方式克隆一个迭代器吗?

rust - `Iterator::inspect` 中闭包的副作用是否定义明确,因此它可以用于例如数数?

c++ - 多重继承虚拟调用歧义