【发布时间】:2010-09-14 20:30:08
【问题描述】:
我正在使用返回原始迭代器的第三方库,例如
Iterator<?> children = element.getChildElements();
我知道实际的类型,但我不一定相信第三方库将来会坚持使用它。有两种(我能想到的)有点冒险的方法来遍历它:
@SuppressWarnings("unchecked")
Iterator<ActualObject> currentChildren = (Iterator<ActualObject>)currentElement.getChildElements();
或
Iterator<?> children = element.getChildElements();
while (null != children && children.hasNext()) {
ActualObject child = (ActualObject)children.next(); //Possible ClassCastException @ runtime
...
}
我能想到的唯一“安全”的遍历这种迭代器的方法如下:
Iterator<?> children = element.getChildElements();
while (null != children && children.hasNext()) {
Object obj = children.next();
ActualObject child = null;
if (obj instanceof ActualObject)
child = (ActualObject)obj;
...
}
这似乎过于冗长。是否有更好但同样“安全”的方式来遍历原始迭代器?
编辑:我意识到我可以在 else 块中捕获/记录异常,我正在寻找(希望)与下面提到的 ColinD 等效的 Java 语言。
【问题讨论】:
-
如果迭代器返回的对象不是
ActualObject的实例,你想发生什么? -
child的类型不是ActualObject怎么办?如果您不需要继续,我认为捕获 ClassCastException 可能是最干净的方法。您可以记录类型不匹配并继续。
-
@pkaeding & @Gangadhar - 我会抛出异常。
-
Guava 方法(就像 Guava 中的许多东西一样)的存在是为了让在核心 Java 中做一些相当冗长的事情变得更容易和更简洁,所以我不希望在 JDK 中找到任何等效的东西.
标签: java generics iterator types