在准备面试题时,我遇到了下面的代码:
List<Object> list = new ArrayList();
Map<Object, ? super ArrayList> m = new HashMap<Object, ArrayList>();
m.put(1, new Object());
m.put(2, list);
上述的两个put方法会抛出编译时错误。但是,当我添加m.put(3, new ArrayList());
时,它会将其添加到Map中而不会有编译时错误。
对于我来说非常清楚,我可以将new Object()
作为值添加到HashMap
中,因为映射声明为< ? super ArrayList>
类型;这意味着我可以添加任何高于 ArrayList
(即ArrayList
的super)的值和ArrayList
对象本身,但不能添加低于ArrayList
的任何值。
这个特定的概念在Kathy Sierra和Bert Bates的SCJP 6中写得非常好,并且基于该理论和示例,我认为它应该按照我的理解执行。请问有人能帮我理解这个错误吗?