我有一个返回map
定义为的方法:
public Map<String, ?> getData();
我不清楚这种方法的实际实现,但是,当我尝试这样做时:
obj.getData().put("key","value")
我收到以下编译时错误消息:
Map 类型中的 put(String, capture#9-of ?) 方法不适用于参数 (String, String)
问题是什么?不是String
什么类型的吗?
提前致谢。
的返回类型
Map<String, ?>
是相同的
Map<String, ? extends Object>
这意味着返回的具体类型可能是Map<String, AnyClass>
. 您不能将 aString
放入 aAnyClass
中,因此会出现错误。
一个好的一般原则是不要在方法返回类型中使用通配符。
通配符的意思是“值类型参数可以是任何东西”——它并不意味着“你可以使用它,就好像它是你想要的任何东西一样”。换句话说, aMap<String, UUID>
作为Map<String, ?>
- 是有效的,但您不希望能够将 String 值放入其中。
如果你想要一个绝对可以接受字符串值的地图,你想要:
Map<String, ? super String>
Map<String, ?>
是的缩写形式,Map<String,? extends Object>
并不意味着任何东西都可以作为价值添加。它说 Map-object 可以有任何泛型值类型扩展Object
。
这意味着 Map 对象也可以是 aHashMap<String, String>
或 a HashMap<String, Integer>
。因为编译器无法检查哪些值类型会被接受,所以他不会让你调用以值类型作为参数的方法。
笔记:
Map<String, ? super String>
会产生相反的效果:您始终可以使用 String 作为参数,但返回类型不清楚。试试这个:
public Map<String, Object> getData();
[编辑]这真的错了......我明白了。
我的第一个答案是:
那是 java : String 不是对象。
尝试
obj.getData().put("key",new String("value"));
但是 String 扩展了 Object... 而我认为 String 是一个原始的。我学到了一些东西^^