ImplementedType implements InterfaceType
我可以转换
Map<String, ImplementedType> m1 = Maps.newHashMap();
Map<String, ? extends InterfaceType> m2 = m1;
但我无法转换
Map<String, List<ImplementedType>> m1 = Maps.newHashMap();
Map<String, List<? extends InterfaceType>> m2 = m1;
Error: java: incompatible types:
java.util.Map<java.lang.String,java.util.List<ImplementedType>>
cannot be converted to
java.util.Map<java.lang.String,java.util.List<? extends InterfaceType>>
但是我可以先将“不安全”转换为“地图”,然后才能正常工作。但这真的是个好主意吗?
Map<String, List<? extends IOGInvoicePageCountInfo>> m2 = (Map) m1;
答案 0 :(得分:4)
这不是一个好主意。演员阵容不安全。例如:
final Map<String, List<Integer>> m1 = new HashMap<>();
final Map<String, List<? extends Number>> m2 = (Map) m1;
m2.put("", Arrays.asList(new Float(0.0)));
System.out.println(m1.get("").get(0).intValue());
会导致:
Exception in thread "main" java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.Integer
m2
的正确类型是:
final Map<String, ? extends List<? extends Number>> m2 = m1;
这是类型安全的,因为您不再可以通过m1
将不兼容的元素放入m2
- 前面的示例将导致编译错误。