我如何可以将添加
MyObj
到这个aMap
?
你不能,因为键类型的上限.
原因? extends A
可能是MyOtherObj implements A
.在这种情况下,能够将类型的键MyObj
放入地图是不安全的:
MapanotherMap = new HashMap<>(); Map extends A, String> aMap = anotherMap; aMap.put(new MyObj(), ""); // Can't do this; but if you could... MyOtherObj obj = anotherMap.keySet().iterator().next(); // ClassCastException!
记住首字母缩略词PECS(更多细节请参阅此问题):
制片人 extends
消费者 super
换句话说,Map extends A, String>
只能用于生成实例A
,它不能使用/接受实例A
.
例如,您可以迭代键("生成"键):
for (A a : aMap.keySet()) { ... }
地图只能"消耗"文字null
:
aMap.put(null, "");
因为null
可以毫无例外地转换为任何类型.但是在只有一个键的地图中没有太多用处 - 您也可以直接存储该值.
安全地执行此类型操作的唯一方法是MyObj
通过您知道接受MyObj
实例的引用将实例放入地图:
MapsafeMap = new HashMap<>(); safeMap.put(new MyObj(), ""); Map extends A, String> aMap = safeMap;
要么
Map safeMap = new HashMap<>(); safeMap.put(new MyObj(), ""); Map extends A, String> aMap = safeMap;