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


我想做这样的事情

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

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

什么是旺了...?


3056
2017-08-05 09:54


起源

stackoverflow.com/questions/1368166/... - Kanagavelu Sugumar


答案:


? 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语言教程,尤其是。 这一页 和之后的那个。


16
2017-08-05 09:59



但如果我想存储怎么办? - Saurabh Kumar
params.put(“a”,“blah”); - Saurabh Kumar
@Saurabh这将工作正常,因为String类(几乎所有类)都是Object的子类。如果要在HashMap中存储绝对任何类的实例,则此实现可以正常工作。您实际尝试实现的一些细节可能有助于我们确定这是否是正确的方法。 - Anthony Grist
我很想知道为什么 final Map<String, Object> params = Collections.<String, Object>emptyMap(); 不起作用。抛出 UnsupportedOperationException 当试图放 <String,String> - Snekse
嘿,谢谢你的启发,老兄! :d - thekucays


? extends Object

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

Map<String, TypeB>

0
2017-08-05 10:12