Я использую стороннюю библиотеку, которая возвращает необработанный итератор, например,
Iterator<?> children = element.getChildElements();
Я знаю реальный тип, но я не обязательно доверяю стороннему lib, чтобы придерживаться его в будущем. Есть два (о которых я могу думать) несколько рискованных способов пройти через это:
@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, я искал (надеялся) на эквивалент языка Java того, что ColinD упоминал ниже.