我正在尝试做这样的事情
final Map<String, ? extends Object> params = new HashMap<String, ? extends Object>();
但java编译器抱怨“无法实例化HashMap();
类型 是什么意思呢??答案 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
,也不是Integer
和String
。编译器无法知道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>