Tôi đang sử dụng thư viện của bên thứ ba trả về một Iterator thô, ví dụ:Duyệt an toàn một Iterator thô trong Java?
Iterator<?> children = element.getChildElements();
Tôi biết loại thực tế, nhưng tôi không nhất thiết phải tin tưởng lib của bên thứ ba dính vào nó trong tương lai. Có hai (mà tôi có thể nghĩ ra) hơi rủi ro cách để đi qua này:
@SuppressWarnings("unchecked")
Iterator<ActualObject> currentChildren = (Iterator<ActualObject>)currentElement.getChildElements();
hoặc
Iterator<?> children = element.getChildElements();
while (null != children && children.hasNext()) {
ActualObject child = (ActualObject)children.next(); //Possible ClassCastException @ runtime
...
}
Các chỉ "an toàn" cách tôi có thể đưa ra để đi qua loại này iterator là như sau:
Iterator<?> children = element.getChildElements();
while (null != children && children.hasNext()) {
Object obj = children.next();
ActualObject child = null;
if (obj instanceof ActualObject)
child = (ActualObject)obj;
...
}
Điều này có vẻ quá chi tiết. Có cách nào tốt hơn, nhưng không kém phần "an toàn" để duyệt qua một trình vòng lặp thô?
EDIT: Tôi nhận ra mình có thể bắt/ghi ngoại lệ trong một khối khác, tôi đang tìm kiếm (hy vọng) cho một ngôn ngữ Java tương đương với những gì ColinD đã đề cập dưới đây.
Bạn muốn điều gì xảy ra nếu có các đối tượng được trình lặp lặp lại có * không * thể hiện của 'ActualObject'? – pkaeding
Cần làm gì nếu loại trẻ không phải là ActualObject? Nếu bạn không cần tiến hành, tôi nghĩ rằng việc bắt ClassCastException có thể là cách tốt nhất để đi. Bạn có thể đăng nhập loại không phù hợp và tiếp tục. – Gangadhar
@pkaeding & @Gangadhar - Tôi sẽ ném một ngoại lệ. –