Estoy usando una biblioteca de terceros que devuelve un iterador sin formato, p. Ej.¿Atraviesa con seguridad un iterador sin formato en Java?
Iterator<?> children = element.getChildElements();
Conozco el tipo real, pero no confío necesariamente en que la lib de terceros se quede con él en el futuro. Hay dos (que se me ocurre) un tanto riesgo maneras de atravesar esta:
@SuppressWarnings("unchecked")
Iterator<ActualObject> currentChildren = (Iterator<ActualObject>)currentElement.getChildElements();
o
Iterator<?> children = element.getChildElements();
while (null != children && children.hasNext()) {
ActualObject child = (ActualObject)children.next(); //Possible ClassCastException @ runtime
...
}
La única forma "segura" Podría llegar a para atravesar este tipo de iterador es la siguiente:
Iterator<?> children = element.getChildElements();
while (null != children && children.hasNext()) {
Object obj = children.next();
ActualObject child = null;
if (obj instanceof ActualObject)
child = (ActualObject)obj;
...
}
Esto parece excesivamente prolijo. ¿Hay una forma mejor, pero igualmente "segura" de atravesar un iterador sin formato?
EDIT: me doy cuenta de que puedo capturar/registrar la excepción en un bloque else, estaba buscando (esperando) un equivalente en lenguaje Java de lo que ColinD ha mencionado a continuación.
¿Qué desea que suceda si hay objetos devueltos por el iterador que son * no * instancias de 'ActualObject'? – pkaeding
¿Qué se debe hacer si el tipo de hijo no es ActualObject? Si no necesita continuar, creo que capturar ClassCastException podría ser la forma más limpia de hacerlo. Puede registrar el tipo no coincidente y continuar. – Gangadhar
@pkaeding & @Gangadhar - Yo lanzaría una excepción. –