2012-03-12 25 views
7

Tôi có một số hạt được tạo bằng JAXB có cấu trúc phân cấp, ví dụ: một bean chứa một danh sách các bean khác. Bây giờ tôi muốn mở rộng một số phần tử con và cũng là phần tử cha giữ các phần tử mở rộng.JAXB mở rộng mã được tạo ra với nhà máy đối tượng mở rộng - rõ ràng phôi tốt?

My ParentEx thực hiện một số giao diện khác IParent được dự kiến ​​sẽ trả lại Collection<IChild>. My ChildEx thực hiện IChild. Tôi có thể trả lại số (Collection<IChild>)super.getChild() khi super.getChild() trả về List<Child> không? Hoặc là có một cách tốt hơn để làm điều này?

  • ChildParent là JAXB tạo đậu
  • ChildExParentEx là đậu của riêng mình cho lập bản đồ đậu JAXB để các giao diện nhất định. Cả đậu ghi đè ObjectFactory
  • IChildIParent là các giao diện cần thiết từ một số thư viện khác

Edit: Eclipse thậm chí không để cho dàn diễn viên của tôi List<Child>-List<ChildEx> vì vậy tôi có thêm một số ký tự đại diện trung gian xấu xí đúc (List<ChildEx>)(List<?>)super.getChild()

+1

Tại sao bạn cần phải làm điều này? 'Danh sách ' "là một" Bộ sưu tập "trong mọi trường hợp. Trừ khi tôi bỏ lỡ điều hiển nhiên, giao diện 'IParent' hoàn toàn được thỏa mãn bởi bất kỳ triển khai' IChild' nào? – user268396

+0

Cảm ơn, nhưng không, 'Parent' có phương thức' List getChild() 'và' IParent' nói rằng nó cần trả về một 'Collection '. Vì vậy, tôi sẽ phải thực hiện một phép cast exlicit trong 'ParentEx' của tôi. Tôi không muốn thay đổi đậu tự tạo, do đó cách duy nhất để có đậu tự động được trang bị cho giao diện 'IParent' là viết một' ParentEx thực hiện IParent' của riêng mình –

+0

Liệu giải pháp với ArrayList mới có làm việc cho bạn không? – Andrejs

Trả lời

3

này nên làm việc:

return new ArrayList<IChild>(childExList); 

hoặc (không đẹp, nhưng tránh dàn diễn viên wildcard):

return Arrays.asList(childExList.toArray(new IChild[]{})); 
1

Trong Java nó không phải là loại an toàn để cast Generic<Type> để Generic<SuperType> đó là những gì bạn đang cố gắng thực hiện bằng cách đúc List<Child> để Collection<IChild>. Hãy tưởng tượng một số List<Integer> được truyền tới List<Object>, điều đó sẽ cho phép bạn đặt bất kỳ thứ gì vào danh sách, không chỉ Integer hoặc các loại phụ.

Bạn có thể an toàn khi đúc Generic<Type> đến GenericSuperType<Type> khi user268396 chỉ ra trong nhận xét.

Bạn sẽ cần sao chép List<Child> vào một số bộ sưu tập mới, ví dụ:

List<Child> sourceList = ... 
List<IChild> targetList = new ArrayList<IChild>(); 
Collections.copy(targetList, sourceList); 

Sau đó bạn có thể trở lại targetList có thể được ngầm đúc để Collection<IChild>

Các vấn đề liên quan