【发布时间】:2011-08-05 09:54:28
【问题描述】:
我正在尝试做这样的事情
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,因此在params 中放入任何内容都不是有效操作。
如果您希望能够将 <String, String> 放入 params 中,请这样声明。例如,
final Map<String, Object> params = new HashMap<String, Object>();
params.put("a", "blah");
有关该主题的良好介绍,请查看有关泛型的 Java 语言教程,尤其是。 this page 和它之后的那个。
【讨论】:
final Map<String, Object> params = Collections.<String, Object>emptyMap(); 不起作用。尝试放置 <String,String> 时抛出 UnsupportedOperationException
Map<String, ?> 而不是 Map<String, ? extends Object>...
? extends Object
不计算任何类型。所以你不能那样说。 1. 如果你想要 AnyType 扩展 Object,那你为什么不简单地传递 Object。 因为扩展 Object 的 anyType 也是一个 Object。默认情况下,每个 Java 类 Type 都扩展 Object。 2.如果你想明确TypeA扩展TypeB, 那么你就可以这样做了
Map<String, TypeB>
【讨论】: