2008-11-18 17 views
5

Làm thế nào để làm điều này trong Java - chuyển một bộ sưu tập kiểu con tới một phương thức yêu cầu một tập hợp kiểu cơ sở?Generics Java - chuyển một tập hợp các kiểu con tới một phương thức đòi hỏi một bộ sưu tập kiểu cơ sở

Ví dụ dưới đây cho phép:

The method foo(Map<String,List>) is not applicable for the arguments (Map<String,MyList>) 

tôi có thể thực hiện bằng cách tạo ra một hệ thống phân cấp lớp cho các bộ sưu tập đánh máy - nhưng là nó có thể khác?

public void testStackOverflow() { 

    class MyList extends AbstractList { 
     public Object get(int index) { 
      return null; 
     } 
     public int size() { 
      return 0; 
     }   
    }; 

    Map <String, List> baseColl = null; 
    Map <String, MyList> subColl = null; 

    foo (subColl);    
} 

private void foo (Map <String, List> in) {  
} 

EDIT: Hóa ra từ các câu trả lời rằng điều này đòi hỏi "kí hiệu wildcard bao" để thêm văn bản này cho khả năng tìm kiếm

Trả lời

17

Thay đổi foo tới:

private void foo(Map <String, ? extends List> in) { 
} 

Điều đó sẽ hạn chế những gì bạn có thể làm trong vòng foo, nhưng điều đó là hợp lý. Bạn biết rằng bất kỳ giá trị nào bạn tìm nạp từ bản đồ sẽ là danh sách, nhưng bạn không biết loại giá trị nào hợp lệ để đưa vào bản đồ.

+0

cảm ơn! đó là giải pháp chính xác :-) – horace

2

như jon s nói:

private void foo (Map <String, ? extends List> in { ... } 

sẽ sửa chữa các lỗi. bạn vẫn sẽ có cảnh báo. hãy xem nguyên tắc đặt tại: http://www.ibm.com/developerworks/java/library/j-jtp07018.html

+0

liên kết tốt đẹp - Tôi vừa mới bắt đầu với google? mở rộng :-) – horace

+0

Generics java không phải là dễ dàng, "Generics java và bộ sưu tập" (http://oreilly.com/catalog/9780596527754/) là rất hữu ích. –

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