将Map<String, ? extends Object>转换为Map<String, Object>

5
在Java 8中,我正在尝试将Map<String, ? extends Object>转换为Map<String, Object>。我认为这是安全的,因为我对输入类型进行了约束(所有?都必须实现Object),但是我收到了未经检查的转换警告。
有任何想法我错在哪里了吗?有没有简洁的解决方案?谢谢你的帮助!
1个回答

5

这个强制类型转换并不安全。具体来说:

Map<String, ? extends Object> before;
before.put("foo", "example"); // <-- illegal

Map<String, Object> after;
after.put("foo", "example"); // <-- legal

请注意,String不是? extends Object的子类,因为您不知道?,但它是更一般的Object的子类,因此第二个调用是可以的。

谢谢@WorldSEnder,我正在尝试解决的用例是使用类型为Map<String, String>的参数设置类型为Map<String, Object>的成员变量。只是将成员变量赋值给参数不可能,因为我认为Map<String, Object>Map<String, String>无关...现在无法找到干净的解决方法... - Antonin
@Antonin,您可以将包含类设置为通用类,并使用泛型参数T将字段类型设置为Map<String,T> - WorldSEnder
谢谢@WorldSEnder,不幸的是,那会在客户端代码中引起太多的更改。我想我必须找到另一种方法。 - Antonin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接