作者:usually111131 | 来源:互联网 | 2023-05-28 15:59
在处理面试问题时,我遇到了以下代码:
List list = new ArrayList();
Map m = new HashMap();
m.put(1, new Object());
m.put(2, list);
上面两个put方法都是抛出编译时错误.但是,当我添加m.put(3, new ArrayList());
它时添加到map没有编译时错误.
我很清楚我可以添加new Object()
一个值,HashMap
因为map声明属于类型 super ArrayList>
; 这意味着我可以补充一点,高于任何值ArrayList
(即超级的ArrayList
)和ArrayList
下面反对过,但没有什么ArrayList
.
这个特殊的概念在Kathy Sierra和Bert Bates的SCJP 6中写得非常好,基于该理论和实例,我认为它应该按照我的理解工作.有人可以帮我理解错误吗?
1> Jesper..:
你误解了通配符的?
含义.你可能有一个常见的误解:
它并不意味着你可以把任何类型的对象在地图这是一种类型,它的父类的ArrayList
.
这意味着地图中的值属于某种类型的未知类型ArrayList
.由于确切的类型是未知的,编译器将不允许您将除ArrayList
自身之外的任何类型的值作为值添加到映射中 - 编译器没有足够的信息来检查您正在执行的操作是否是类型安全的.
假设这是允许的,那么你可以做这样的坏事:
Map m1 = new HashMap();
Map m2 = m1;
// This should not be allowed, because m2 is really a HashMap
m2.put(1, new Object());
(现在在计算机上)... super关键字有一个巨大的用例.查看Joshua Bloch的书"Effective Java(第2版)",他描述了PECS,它代表"Producer Extends,Consumer Super".这个SO答案可能有助于提供更多的洞察力:http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs