使用通配符和通配符的问题

时间:2009-12-17 11:52:22

标签: java generics map arguments wildcard

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

public Map<String, ?> getData();

这个方法的实际实现对我来说并不清楚,但是,当我尝试这样做时:

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

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

  

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

有什么问题? String是不是什么类型?

提前致谢。

5 个答案:

答案 0 :(得分:15)

的返回类型
Map<String, ?>

相同
Map<String, ? extends Object>

表示返回的具体类型可能是Map<String, AnyClass>。您无法将String放入AnyClass,因此会出错。

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

答案 1 :(得分:10)

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

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

Map<String, ? super String>

答案 2 :(得分:3)

Map<String, ?>Map<String,? extends Object>的缩写形式,并不代表可以添加任何内容作为值。它表示Map-object可以具有任何扩展Object的通用值类型。

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

注意:

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

答案 3 :(得分:0)

试试这个:

public Map<String, Object> getData();

答案 4 :(得分:-2)

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

我的第一个答案是:

  

那是java:String不是对象。

     

尝试

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

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