Java - 投射地图

Mar*_*ark 15 java casting map

我怎样才能Map<Object,Object>Map<String,String>最干净的方式投出?

有没有办法在不迭代地图的情况下做到这一点?

谢谢

Chr*_*s J 11

实际的答案是:

Map<Object,Object> valueMap = ...;
@SuppressWarnings("unchecked")
Map<String,String> targetMap = (Map)valueMap;
Run Code Online (Sandbox Code Playgroud)

  • 因为那不编译. (5认同)
  • 关于为什么 (Map)valueMap 有效但 (Map&lt;String,String&gt;) 无效的一些解释? (2认同)

Voo*_*Voo 9

我认为解释为什么简单的解决方案不起作用以及为什么你永远不应该使用它是一个好主意.

假设您可以转换List<Object>List<String>(同样适用于Map,只是一个更简单的接口).您希望从以下代码中发生什么:

List<Object> m = Something;
m.add("Looks good.");
m.add(42);
List<String> s = (List<String>)m; // uhuh, no we don't want that.
String myString = s.get(1); // huh exception here.
Run Code Online (Sandbox Code Playgroud)

现在你可以使用波希米亚人/克里斯解决方案破解它,但你基本上破坏了Java的类型系统.不要那样做.您不希望List<String>包含整数!稍后进行有趣的调试 - 循环遍历所有变量的附加代码将避免许多令人头痛的问题并且几乎不会出现性能问题.

如果有理由将Map声明为使用Object而不是String,则可能会向其添加任何对象 - 通常您应该能够通过更好的泛型来避免这种情况.


Tho*_*aux 9

想要干净,就必须“深度”转换!键和值。

使用 Java 8 流,只需几行:

static public Map<String, String> toStringString(Map<? extends Object, ? extends Object> map) {
        return map
                .entrySet()
                .stream()
                .collect(Collectors.toMap(
                    e -> e.getKey().toString(),
                    e -> e.getValue().toString()
                ));
    }
Run Code Online (Sandbox Code Playgroud)