这个赋值无效:`Map mObj = new HashMap ();`?
在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[]>();
的方法,当然,我无法更改此方法。再次感谢你。
错误是因为泛型不支持子类型。 Number a = new Integer(5)
是有效的情况。但是一旦你把泛型给编译错误ArrayList<Number> a = new ArrayList<Integer>()
是不允许的。查看此链接是否有助于https://dzone.com/articles/5-things-you-should-know-about-java-generics了解泛型的一些指南。
这样做:
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和this one too
你绝对是对的,但是因为我可以通过投射到未参数化的Map中来绕过我的错误,所以我仍然有能力搞砸那些不正常的普通操作;你不认为它会更加相关只取得一个未经检查的警告,而不是一个不兼容的类型错误? – ncenerar
伟大的联系,我不知道泛型是如何工作的,什么是多重界限,以及为什么你不能分型。但是你可以在链接中提到的扩展和超级使用通配符,这可能在这里工作。 – Asoub