我想做这样的事情
final Map<String, ? extends Object> params = new HashMap<String, ? extends Object>();
但java编译抱怨说“无法实例化HashMap();
什么是旺了...?
我想做这样的事情
final Map<String, ? extends Object> params = new HashMap<String, ? extends Object>();
但java编译抱怨说“无法实例化HashMap();
什么是旺了...?
? 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");
有关该主题的详细介绍,请参阅有关泛型的Java语言教程,尤其是。 这一页 和之后的那个。
? extends Object
不评估任何类型。所以你不能这样提。 1.如果你想AnyType extends Object,那你为什么不简单地传递Object。 因为任何扩展Object的类型也是一个Object。默认情况下,每个Java类都扩展了Object。 2.如果你想特意TypeA扩展TypeB, 然后你可以这样做
Map<String, TypeB>