我在工作中遇到了一个令人烦恼的问题。 我必须更改我们的一个API类型,因此我要处理类似的事情
List<Map<String, ?>>.
所以,总而言之,99.8%的病例都表示满意。 但是我们在我们要在内部地图中添加一些新条目的位置很少。
所以这是我的问题,是否有一种简单的方法可以将新条目添加到MapObject中,输入如下:
Map<string, ?>
没有恼人的投射波。
===== EDIT =====
我自己想出了一个解决方案。我只是使用Map的copy-Constructor,更改副本并丢弃原始文件。在我的情况下这是好的,因为这些地图只是数据库表的行,不应该太长/太大。
但我仍然很好奇,如果有更好的方法来做到这一点。 如果你知道更好的话,请告诉我。
答案 0 :(得分:0)
如Unbounded Wildcards的Oracle教程中所述,您只能将null插入到无界通配符中:
注意List&lt; Object&gt;非常重要。和列表&lt;?&gt;不一样。您可以将Object或Object的任何子类型插入List&lt; Object&gt;。但是你只能在List&lt;?&gt;中插入null。 “通配符使用指南”部分提供了有关如何确定在特定情况下应使用哪种通配符(如果有)的更多信息。
通过使用通配符类型,您明确声明它是具有类型的Map,但未指定该类型。添加到Map中是不安全的,因为编译器不知道它包含的类型。
如果您乐意将null添加到通配符类型,那么您可以这样做:
private void addToMap(List<Map<String,?>> l){
l.get(0).put("String",null);
}
泛型的想法是在编译时引入类类型安全而不是依赖于运行时ClassCastExceptions,因此如果需要大量的转换来使您的实现工作,您应该好好看看这个。使用复制构造函数来解决这个问题也不是一个好主意,因为它使用了未经检查的赋值。
这是leaving broken windows的一个例子。不要这样做。如果返回的类型过于通用,那么修复类型,不要在它们之上构建。您可能应该做的是修改方法参数类型。我发现很难相信进行调用的构造要求你的方法处理Map&lt; String,?&gt;。你应该至少使用Map&lt; String,Object&gt;。