17

我有一个返回map定义为的方法:

public Map<String, ?> getData();

我不清楚这种方法的实际实现,但是,当我尝试这样做时:

obj.getData().put("key","value")

我收到以下编译时错误消息:

Map 类型中的 put(String, capture#9-of ?) 方法不适用于参数 (String, String)

问题是什么?不是String什么类型的吗?

提前致谢。

4

5 回答 5

18

的返回类型

Map<String, ?>

是相同的

Map<String, ? extends Object>

这意味着返回的具体类型可能是Map<String, AnyClass>. 您不能将 aString放入 aAnyClass中,因此会出现错误。

一个好的一般原则是不要在方法返回类型中使用通配符。

于 2009-12-17T11:56:41.787 回答
13

通配符的意思是“值类型参数可以是任何东西”——它并不意味着“你可以使用它,就好像它是你想要的任何东西一样”。换句话说, aMap<String, UUID>作为Map<String, ?>- 是有效的,但您不希望能够将 String 值放入其中。

如果你想要一个绝对可以接受字符串值的地图,你想要:

Map<String, ? super String>
于 2009-12-17T11:55:06.503 回答
6

Map<String, ?>是的缩写形式,Map<String,? extends Object>并不意味着任何东西都可以作为价值添加。它说 Map-object 可以有任何泛型值类型扩展Object

这意味着 Map 对象也可以是 aHashMap<String, String>或 a HashMap<String, Integer>。因为编译器无法检查哪些值类型会被接受,所以他不会让你调用以值类型作为参数的方法。

笔记:

  • 您可以调用具有值类型作为返回值的方法,因为一切都必须扩展 Object (? extends Object)
  • AMap<String, ? super String>会产生相反的效果:您始终可以使用 String 作为参数,但返回类型不清楚。
于 2009-12-17T13:50:20.123 回答
0

试试这个:

public Map<String, Object> getData();
于 2009-12-17T11:54:51.760 回答
-2

[编辑]这真的错了......我明白了。

我的第一个答案是:

那是 java : String 不是对象。

尝试

obj.getData().put("key",new String("value"));

但是 String 扩展了 Object... 而我认为 String 是一个原始的。我学到了一些东西^^

于 2009-12-17T11:54:18.923 回答