Map <string,?=“”>如何使用它</string,>

时间:2013-11-07 10:00:59

标签: java map casting

我需要在java中使用Map中的'?'可以是任何类型的值,如整数,布尔值,长整数等。这就是我所拥有的:

Map<String, ?> prefs = Preferences.GetPrefs();

// Now I would like to use it to add new values...
prefs.put("Hi", true); // <-- error

我该如何使用它?感谢

3 个答案:

答案 0 :(得分:3)

使用对象

Map<String, Object> prefs = Preferences.GetPrefs();
然后

获取

Boolean result = (Boolean)prefs.get("Hi"); 

答案 1 :(得分:3)

您可能不会在prefs上调用涉及第二个泛型类型参数的任何方法,因为该类型在您的上下文中是未知的。 Map<String ?>返回类型背后的意图是“调用者不应该突变此地图”。

您应该将Map<String, ?>视为不是明确的类型,而不是明确的类型匹配的模板。具体来说,Map<String, ?>代表“具有String类型键的任何此类地图”。例如,Map<String, Integer>与此模板匹配,可以分配给您的变量。显然,您不能将String值添加到此类地图中。

如果您的GetPrefs方法已修复,那么您唯一的办法就是强行将未经检查的强制转换为明确的通用类型Map<String,Object>,从而失去类型安全性。

否则,如果您控制Preferences类,请将该方法的返回类型更改为Map<String, Object>,如果这对您的情况有意义。

答案 2 :(得分:2)

关于?的事情是,它意味着集合有一个类型,但我们不知道它是什么。这意味着我们不能在集合中放置任何值,因为它们可能与(未知)集合类型不匹配。

将此代码视为原因的一个示例:

Map<String, String> a = new HashMap<String, String>();
Map<String, ?> b = a;
a.put("bar", "baz"); // This is fine: Normal use
b.put("foo", 25); // This won't compile

String baz = a.get("bar"); // Returns the string "baz"
String twentyfive = a.get("foo"); // Return type is String, but the map would contain an Integer.  Run-time exception.