使用带有通配符的通用映射时出现问题

2022-09-03 00:10:27

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

public Map<String, ?> getData();

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

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

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

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

问题出在哪里?不是什么类型的?String

提前致谢。


答案 1

返回类型

Map<String, ?>

与 相同

Map<String, ? extends Object>

返回的具体类型的均值可以是 .您不能将 a 放入 ,因此会出现错误。Map<String, AnyClass>StringAnyClass

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


答案 2

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

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

Map<String, ? super String>