1

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

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

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

我该如何使用它?谢谢

4

3 回答 3

5

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

您应该阅读Map<String, ?>的不是确定的类型,它不是,而是作为与确定的类型匹配的模板。具体来说,Map<String, ?>代表“任何具有String-typed 键的此类映射”。例如Map<String, Integer>匹配这个模板并且可以分配给你的变量。显然,您不能String为这样的地图赋值。

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

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

于 2013-11-07T10:05:30.660 回答
3

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

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

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.
于 2013-11-07T10:09:08.920 回答
3

使用对象

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

然后取

Boolean result = (Boolean)prefs.get("Hi"); 
于 2013-11-07T10:01:52.507 回答