Java无法将具有实现类型的集合集合转换为接口类型

时间:2016-10-13 19:13:57

标签: java collections

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;

1 个答案:

答案 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 - 前面的示例将导致编译错误。