Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用带通配符的泛型映射时出现问题_Java_Generics_Map_Arguments_Wildcard - Fatal编程技术网

Java 使用带通配符的泛型映射时出现问题

Java 使用带通配符的泛型映射时出现问题,java,generics,map,arguments,wildcard,Java,Generics,Map,Arguments,Wildcard,我有一个返回map的方法,定义为: public Map<String, ?> getData(); 我收到以下编译时错误消息: 方法put(字符串、捕获#9-of?) 在类型映射中 不适用于参数 (弦,弦) 有什么问题?String不是任何类型的吗 提前谢谢。[EDIT]这真的是错的。。。我明白了 我的第一个回答是: 这就是java:字符串不是对象 试一试 obj.getData().put("key",new String("value")); 但字符串扩展了对象。。。而我认

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

public Map<String, ?> getData();
我收到以下编译时错误消息:

方法put(字符串、捕获#9-of?) 在类型映射中 不适用于参数 (弦,弦)

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


提前谢谢。

[EDIT]这真的是错的。。。我明白了

我的第一个回答是:

这就是java:字符串不是对象

试一试

obj.getData().put("key",new String("value"));
但字符串扩展了对象。。。而我认为弦是一种原始的东西。我学到了一些东西^ ^

试试这个:

public Map<String, Object> getData();
publicmap getData();
通配符的意思是“值类型参数可以是任何东西”-它并不意味着“你可以像使用任何你想要的东西一样使用它”。换句话说,
映射
作为
映射
是有效的,但您不希望能够将字符串值放入其中

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

Map<String, ? super String>
Map
的返回类型

Map<String, ?>
Map

Map<String, ? extends Object>
Map
这意味着返回的具体类型可以是
Map
。您不能将
字符串
放入
任何类
,因此会出现错误

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

Map
Map
的缩写形式,并不意味着任何东西都可以作为值添加。它表示映射对象可以具有任何扩展
对象的通用值类型

这意味着映射对象也可以是
HashMap
HashMap
。因为编译器无法检查哪些值类型将被接受,所以他不允许您以值类型作为参数调用方法

注:

  • 您可以调用值类型为返回值的方法,因为所有内容都必须扩展对象(?extends Object)
  • Map
    将产生相反的效果:您可以始终使用字符串作为参数,但返回类型不清楚

字符串当然是一个对象。您认为在这种情况下显式调用字符串构造函数会有什么确切的区别?字符串不是基元类型,是吗?不,它不是基元类型。。。那你为什么说它不是一个物体?我相信它是一个原始的,像一个几乎是物体。。。弄错但是我的想法和Ben Lings的有什么不同呢?Ben Lings的答案完全不同,而且准确。你认为你的答案和本的有什么相似之处?谢谢你的回答。。你的反应如此之快给我留下了深刻的印象。。。许多thanksString类是最终类,所以只需映射即可
Map<String, ? extends Object>