为什么我不能创建一个String和泛型对象的Map

时间:2011-08-05 09:54:28

标签: java generics map hashmap

我正在尝试做这样的事情

  final Map<String, ? extends Object> params = new HashMap<String, ? extends Object>();

但java编译器抱怨“无法实例化HashMap();

类型 是什么意思呢??

2 个答案:

答案 0 :(得分:16)

? extends Object是一个通配符。它代表“某种未知类型,我们唯一知道的是它是Object的子类型”。它在声明中很好但你不能实例化它,因为它不是一个实际的类型。试试

final Map<String, ? extends Object> params = new HashMap<String, Object>();

因为您不知道?是什么类型,所以您无法为其分配任何内容。由于Object是所有内容的超类型,因此可以为params分配对HashMap<String, Integer>以及HashMap<String, String>的引用,以及许多其他内容。 String不是Integer,也不是IntegerString。编译器无法知道params可能是哪个,因此在params中放置任何内容都不是有效的操作。

如果您希望能够将<String, String>放入params,那么请将其声明为final Map<String, Object> params = new HashMap<String, Object>(); params.put("a", "blah"); 。例如,

{{1}}

有关该主题的详细介绍,请查看泛型的Java语言教程,尤其是。 this page以及之后的那个。

答案 1 :(得分:0)

? extends Object

不评估任何类型。所以你不能这样提。 1.如果你想AnyType extends Object,那你为什么不简单地传递Object。 因为任何扩展Object的类型也是一个Object。默认情况下,每个Java类都扩展了Object。 2.如果你想特意TypeA扩展TypeB,   那么你可以这样做

Map<String, TypeB>