为什么我不能创建字符串和通用对象的映射

2022-09-04 20:28:56

我正在尝试做这样的事情

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

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

什么黄与它..?


答案 1

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

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

因为你不知道是什么类型,所以你不能给它分配任何东西。由于是所有事物的超类型,因此可以分配一个引用,以同时分配到以及,等等。A 不是也不是 .编译器无法知道哪个可能是,因此在 中放入任何内容都不是有效的操作。?ObjectparamsHashMap<String, Integer>HashMap<String, String>StringIntegerIntegerStringparamsparams

如果你想能够投入,那么就这样声明它。例如<String, String>params

final Map<String, Object> params = new HashMap<String, Object>();
params.put("a", "blah");

有关该主题的良好介绍,请查看有关泛型的Java语言教程,特别是此页面及其后的页面


答案 2
? extends Object

不计算为任何类型。所以你不能这样提到。1.如果你想要AnyType扩展Object,那么你为什么不简单地传递Object。因为扩展对象的 anyType 也是一个对象。并且默认情况下,每个 Java 类 Type 都扩展对象。2.如果你特别想要A型扩展B型,那么你可以这样做

Map<String, TypeB>