Java 添加一些值到 Map<..., ?>

标签 java dictionary wildcard put

我在工作中遇到了一个令人烦恼的问题。 我必须更改我们其中一个 API 的某些类型,因此我必须处理类似的事情

List<Map<String, ?>>.

所以,总而言之,99.8% 的情况都是令人满意的。 但是我们的内部 map 中只有很少的位置需要添加一些新条目。

所以这是我的问题,是否有一种简单的方法可以将新条目添加到 MapObject 中,键入如下:

Map<string, ?>

没有烦人的转换波。

=====编辑=====

我自己想出了一个解决方案。我只是使用 Map 的复制构造函数,更改副本并扔掉原始版本。在我的例子中这是可以的,因为这些映射只是数据库表的行,不应该太长/太大。

但我仍然很好奇是否有更好的方法来做到这一点。 如果您知道更好的方法来完成此任务,请告诉我。

最佳答案

如 Oracle 教程 Unbounded Wildcards 中所述您只能将 null 插入到无界通配符中:

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/

相关文章:

java - 删除 JFreeChart 中条形图和轴线之间的分隔

java - 如何在Java中捕获鼠标光标?

Python:从列表创建字典并自动生成/增加键(列表是实际键值)?

c# - 使用带有 IDictionary<Mycustomclass, List<string>> 的自定义解析器的反序列化问题

Python:通配符子集导入

java - 有没有办法知道 Java 程序是从命令行启动还是从 jar 文件启动的?

Python字典非常慢(二维哈希表)

带有通配符的 Java 泛型无法编译

Java 通配符和泛型? super T 和?延伸 T

java - 参数和变量中使用 `? super`的区别