我在工作中遇到了一个令人烦恼的问题。 我必须更改我们其中一个 API 的某些类型,因此我必须处理类似的事情
List<Map<String, ?>>.
所以,总而言之,99.8% 的情况都是令人满意的。 但是我们的内部 map 中只有很少的位置需要添加一些新条目。
所以这是我的问题,是否有一种简单的方法可以将新条目添加到 MapObject 中,键入如下:
Map<string, ?>
没有烦人的转换波。
=====编辑=====
我自己想出了一个解决方案。我只是使用 Map 的复制构造函数,更改副本并扔掉原始版本。在我的例子中这是可以的,因为这些映射只是数据库表的行,不应该太长/太大。
但我仍然很好奇是否有更好的方法来做到这一点。 如果您知道更好的方法来完成此任务,请告诉我。
最佳答案
如 Oracle 教程 Unbounded Wildcards 中所述您只能将 null 插入到无界通配符中:
block 引用>It's important to note that List<Object> and List<?> are not the same. You can insert an Object, or any subtype of Object, into a List<Object>. But you can only insert null into a List<?>. The Guidelines for Wildcard Use section has more information on how to determine what kind of wildcard, if any, should be used in a given situation.
通过仅使用通配符类型,您明确声明它是一个具有类型的 Map,但该类型未指定。添加到此映射根本不安全,因为编译器不知道它包含什么类型。
如果您愿意将 null 添加到通配符类型,那么您可以这样做:
private void addToMap(List<Map<String,?>> l){ l.get(0).put("String",null); }
泛型的想法是在编译时引入类类型安全,而不是依赖运行时 ClassCastExceptions,因此如果需要大量转换才能使您的实现正常工作,您应该仔细看看这一点。使用复制构造函数来解决这个问题也不是一个好主意,因为它使用了未经检查的赋值。
这是 leaving broken windows 的示例。不要这样做。如果返回的类型太通用,则修复类型,不要在它们之上构建。您可能应该做的是修改方法参数类型。我发现很难相信进行调用的构造期望您的方法处理 Map
。您至少应该使用 Map 。
关于Java 添加一些值到 Map<..., ?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26212409/