什么在此分配中无效:`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
,所以应该可以。
如果我像这样投射到一个未参数化的 Map
:Map<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 理解关于泛型的一些指南。
在java中,这个赋值有什么问题:
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>();
因为实际上,我调用了一个方法 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 理解关于泛型的一些指南。