3

在Java中,什么是错的这个任务:这个赋值无效:`Map <String,Object> mObj = new HashMap <String,String []>();`?

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

我得到:

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

由于String[]Object,应该工作。 如果我投下一个未参数化的Map,像这样:Map<String, Object> mObj = (Map) new HashMap<String, String[]>();,它正在工作,但当然,我收到一个警告,它很脏。

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

谢谢!

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

回答

8

错误是因为泛型不支持子类型。 Number a = new Integer(5)是有效的情况。但是一旦你把泛型给编译错误ArrayList<Number> a = new ArrayList<Integer>()是不允许的。查看此链接是否有助于https://dzone.com/articles/5-things-you-should-know-about-java-generics了解泛型的一些指南。

+0

伟大的联系,我不知道泛型是如何工作的,什么是多重界限,以及为什么你不能分型。但是你可以在链接中提到的扩展和超级使用通配符,这可能在这里工作。 – Asoub

1

这样做:

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

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

5

让看看会发生什么,如果你写了什么是可能的:

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 answerthis one too

+0

你绝对是对的,但是因为我可以通过投射到未参数化的Map中来绕过我的错误,所以我仍然有能力搞砸那些不正常的普通操作;你不认为它会更加相关只取得一个未经检查的警告,而不是一个不兼容的类型错误? – ncenerar

相关问题