开发者

Type mismatch between ? and java.Object in Map<String,?> <==> map.put("str", new Object())

Can someone explain the following error (from eclipse IDE):

The method 开发者_如何转开发put(String, capture#1-of ?) in the type Map is not applicable for the arguments (String, Object)

Received on line 3 of the code blow:

public class MyTest {
    public void populateUserLoggedIn(Map<String, ?> model){
        model.put( "test", new Object() );
    }
}


? is not equivalent to Object for methods that take ? as a parameter. With a Map<String, ?>, the signature of put is put(String, ?). You can't pass anything but null for a ? parameter.

Consider this:

Map<String, Integer> map = new HashMap<String, Integer>();
myTest.populateUserLoggedIn(map);
Integer foo = map.get("test"); // ClassCastException

Since populateUserLoggedIn takes a Map<String, ?>, a map with any type of values can be passed in... so within the method you have no way of knowing what types are or aren't legal as values. Therefore, you cannot add any.


The type of the values of model is undefined, so the compiler can't guarantee that a value of type Object will be appropriate.


You should read this paragraph:

As an example of an unbounded wildcard, List<?> indicates a list which has an unknown object type. Methods which take such a list as an argument can take any type of list, regardless of parameter type. Reading from the list will return objects of type Object, and writing non-null elements to the list is not allowed, since the parameter type is not known.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜