在Java中安全地遍历原始迭代器?

Jus*_*ick 7 java generics types iterator

我正在使用第三方库来返回原始迭代器,例如

Iterator<?> children = element.getChildElements();
Run Code Online (Sandbox Code Playgroud)

我知道实际的类型,但我不一定相信第三方lib将来会坚持使用它.有两种(我可以想到)有些冒险的方法来遍历这个:

@SuppressWarnings("unchecked")
Iterator<ActualObject> currentChildren = (Iterator<ActualObject>)currentElement.getChildElements();
Run Code Online (Sandbox Code Playgroud)

要么

Iterator<?> children = element.getChildElements();
while (null != children && children.hasNext()) {
  ActualObject child = (ActualObject)children.next(); //Possible ClassCastException @ runtime
  ...
}
Run Code Online (Sandbox Code Playgroud)

我可以想出来遍历这种迭代器的唯一"安全"方法如下:

Iterator<?> children = element.getChildElements();
while (null != children && children.hasNext()) {
  Object obj = children.next();
  ActualObject child = null;
    if (obj instanceof ActualObject)
      child = (ActualObject)obj;
    ...
}
Run Code Online (Sandbox Code Playgroud)

这似乎过于冗长.是否有更好,但同样"安全"的方式来遍历原始迭代器?

编辑:我意识到我可以在else块中捕获/记录异常,我正在寻找(希望)Java语言等同于ColinD在下面提到的内容.

Col*_*inD 7

Guava使用Iterators.filter(Iterator <?>,Class <T>)方法使其变得简单.它返回一个不可修改的Iterator<T>,基本上只是跳过给定迭代器的不是类型实例的每个元素T:

Iterator<ActualObject> children = Iterators.filter(element.getChildElements(),
    ActualObject.class);
Run Code Online (Sandbox Code Playgroud)

显然,您可以遍历生成的迭代器,而无需将每个元素强制转换为ActualObject AND而不必担心ClassCastException.