Reputation: 2880
I have the following JAVA
method implemented due a interface:
public String importDocument(ImportSource source, Map<String, ? extends Object> paramMap);
When i try to do following, i get an compile warning. Snippet:
paramMap.put("Key", "Value");
Error:
The method put(String, capture#1-of ? extends Object) in the type Map is not applicable for the arguments (String, String)
Why?
Upvotes: 31
Views: 59880
Reputation: 68985
? extends Object
You are using generic wildcard. You cannot perform add operation as class type is not determinate. You cannot add/put anything(except null).
For more details on using wildcard you can refer oracle docs.
Collection<?> c = new ArrayList<String>();
c.add(new Object()); // Compile time error
Since we don't know what the element type of c stands for, we cannot add objects to it. The add()
method takes arguments of type E
, the element type of the collection. When the actual type parameter is ?
, it stands for some unknown type
. Any parameter we pass to add would have to be a subtype of this unknown type. Since we don't know what type that is, we cannot pass anything in. The sole exception is null, which is a member of every type
.
Upvotes: 32