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在下面提到的内容.
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.