2012-01-11 31 views
5

Vì vậy, tôi đã một bản đồ có một số giá trị trong nó được thông qua vào một phương pháp:Đưa vào một bản đồ <String, ?>

public String doThis(Map<String, ?> context){ 
..... 
} 

Và tôi đang cố gắng để chèn một thuộc tính bổ sung vào Bản đồ này

String abc="123"; 
context.put("newAttr",abc); 

Nhưng tôi nhận được lỗi này:

The method put(String, capture#8-of ?) in the type Map is not applicable for the arguments (String, String)

có anyway để thực hiện đặt này mà không có "nhân bản" Bản đồ?

+0

Bạn đang cố gắng tạo Bản đồ có thể lưu trữ bất kỳ loại đối tượng nào không? – Perception

Trả lời

11

Nếu bạn muốn đặt các giá trị loại X vào chung Map, bạn cần khai báo MapMap<String, ? super X>. Trong ví dụ của bạn X là String, vì vậy:

public String doThis(Map<String, ? super String> context){ 
..... 
} 

Map<String, ? super X> có nghĩa là: bản đồ với các phím kiểu String và giá trị của một loại đó là X hoặc một siêu loại X. Tất cả các đồ như đã sẵn sàng để chấp nhận String các cá thể dưới dạng các khóa và các cá thể X làm các giá trị.

+1

+1, nhưng đoạn cuối của bạn có lỗi đánh máy: nghĩa là 'super' thay vì' extends'. :-) – ruakh

+0

@ruakh Thật vậy. Cảm ơn. –

+0

Tốt. Cảm ơn bạn. – ovaherenow

4

Hãy nhớ PECS (Nhà sản xuất mở rộng, Siêu người tiêu dùng). Bạn có một người tiêu dùng (đưa vào), do đó nó không thể là extends.

0

Đáng ngạc nhiên chúng tôi có thể chuyển đổi bản đồ này thành biểu mẫu dễ sử dụng hơn. Chỉ với cú pháp mô phỏng này: (Map<String, ObjectOrSth>)unfriendlyMap.

// Let's get this weird map. 
HashMap<String, String> mapOrig = new HashMap<String, String>(); 
Map<String, ?> mapQuestion = (Map<String, ?>)mapOrig; 
//mapQuestion.put("key2", "?"); // impossible 

// Convert it to almost anything... 
Map<String, String> mapStr2 = (Map<String, String>)mapQuestion; 
mapStr2.put("key2", "string2"); 
assertThat(mapOrig.get("key2")).isEqualTo("string2"); 
Map<String, Object> mapObj = (Map<String, Object>)mapQuestion; 
mapObj.put("key3", "object"); 
assertThat(mapOrig.get("key3")).isEqualTo("object"); 
Các vấn đề liên quan