gpt4 book ai didi

java - 泛型无法实例化 `new HashMap` 。为什么?

转载 作者:行者123 更新时间:2023-12-01 06:26:46 27 4
gpt4 key购买 nike

为什么下面这行代码在 HashMap 中会出错?它没有在赋值的右侧使用通配符。

Map<String,?> map=new HashMap<String,?>();

最佳答案

您无法实例化这样的参数化类型。通配符参数化类型不是具体类型,因此它们不能出现在新表达式中。

通配符参数化类型表示包含泛型类型的具体实例的类型族。所使用的通配符的类型决定了哪些具体参数化类型属于该族。

所以,Map<String,?>表示类型族,可以是 Map<String, Object> , Map<String, String> , 任何事物。创建实际 map 时必须使用具体类型。

所以,你可以这样做:

Map<String,?> map=new HashMap<String, String>();
Map<String,?> map=new HashMap<String, Object>();

但此声明的问题是,除了 null 之外,您不能向 map 添加任何内容。 .

<小时/>

另一方面,请考虑其他类型的通配符 - 上限下限

<强> Upper Bounded Wildcard :

Map<String, ? extends Number>

此类型表示的类型族是具体实例化,其中值类型为 Number ,或 Number 的子类型。因此,对于这个,以下是具体参数化类型的有效创建:

Map<String, ? extends Number> map = new HashMap<String, Number>();
Map<String, ? extends Number> map = new HashMap<String, Integer>();

但是,这里的问题是,除了 null 之外,您无法在 map 中添加任何内容。或之前从中获取的值。

<小时/>

<强> Lower Bounded wildcard :

Map<String, ? super Integer>

正如您所知,您无法使用无界通配符或上限通配符向通配符参数化类型添加任何内容。还有第三种类型 - 下限通配符,如果您要向 map 添加某些内容,可以使用它。上述参数化类型的类型族是采用 Integer 类型值的类型。或者它是 super 类型。因此,您可以像这样实例化它:

Map<String, ? super Integer> map = new HashMap<String, Number>();
Map<String, ? super Integer> map = new HashMap<String, Integer>();
Map<String, ? super Integer> map = new HashMap<String, Serializable>();

但是这里还有另一个问题。虽然你可以给它添加一个值,但是当你获取某个值时,你无法确定你得到的是什么类型。

<小时/>

因此,根据您的要求,您可能必须使用一种或另一种类型的通配符。问题中的更多信息可能会对您有所帮助。但是,一般来说,请记住,您不能创建通配符参数化类型的对象,而只能创建具体参数化类型。

关于java - 泛型无法实例化 `new HashMap<String, ?>` 。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18474379/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com