什么在此分配中无效:`Map<String, Object> mObj = new HashMap<String, String[]>();`?

What is not valid in this assignment: `Map<String, Object> mObj = new HashMap<String, String[]>();`?

在java中,这个赋值有什么问题:

Map<String, Object> mObj = new HashMap<String, String[]>();

我得到:

error: incompatible types: HashMap<String,String[]> cannot be converted to Map<String,Object>

因为 String[] 是一个 Object,所以应该可以。 如果我像这样投射到一个未参数化的 MapMap<String, Object> mObj = (Map) new HashMap<String, String[]>();,它正在工作,但当然,我收到警告并且它是脏的。

此外,我觉得我的第一个作业应该可以。

谢谢!

PS:我不能简单地将 new HashMap<String, String[]>(); 更改为 new HashMap<String, Object>(); 因为实际上,我调用了一个方法 returns a Map<String, String[]>(); 当然,我无法更改此方法。再次感谢。

这样做:

Map<String, ? extends Object> mObj = new HashMap<String, String[]>();

但我不能告诉你为什么你的解决方案不起作用。

让我们看看如果您写的内容可行的话会发生什么:

HashMap<String, String[]> foo = new HashMap<String, String[]>();
Map<String, Object> bar = foo;
bar.put("key",new Object());
String[] baz = foo.get("key"); // <-- ClassCastException

看到问题了吗?一系列正常的、平凡的操作将导致 ClassCastException 在一个你认为不可能发出的地方。

编辑:总而言之,Map<String, Object> 不是 Map<String, String>Map<String, Object[]>Map<String, String[]> 的超类型,因此赋值将不起作用,因为这些类型不是兼容。这就是通配符的用武之地;见 this answer and this one too

错误是因为泛型不支持子类型化。 Number a = new Integer(5) 是有效的案例。但是一旦你放入泛型,它就会给出编译错误 ArrayList<Number> a = new ArrayList<Integer>() is not allowed。看看这个 link 是否有助于 https://dzone.com/articles/5-things-you-should-know-about-java-generics 理解关于泛型的一些指南。