gpt4 book ai didi

带有通配符的 Java 泛型类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:14 25 4
gpt4 key购买 nike

我想写一个可以接受参数的方法:

Map<String, [the type here could be anything]>

所以,这是我编写的代码:

/**
* Get list value from a map, empty list if there's no key matched
*/
private List<? extends Object> getListValueFromMap(Map<String, List<? extends Object>> map, String key) {
List<? extends Object> list = map.get(key);
return list == null ? EMPTY_LIST : list;
}

还有 EMPTY_LIST定义如下:

List<Object> EMPTY_LIST = Collections.unmodifiableList(new ArrayList<Object>());

问题是当我用下面的代码调用这个方法时,Eclipse 告诉我给定参数的类型不适用的错误。

getListValueFromMap(cityNameMap, "key");

错误是:

The method getListValueFromMap(Map<String,List<? extends Object>>, String) in the type ChinaAreaResource is not applicable for the arguments (Map<String,List<City>>, String)

我哪里出错了?

这里是cityNameMap的定义:

/** map city's name to city list */
private Map<String, List<City>> cityNameMap;

最佳答案

重要的是要注意什么? extends Object 实际上代表泛型。

在目前的咒语中,它是一个 upper-bounded wildcard它的上限为 Object。理想情况下,这将暗示您可以使用其中的任何列表,但由于泛型是不变的,所以这里根本不是这种情况 - 您只能使用具有相同界限的列表。

由于列表的包含类型可能因 map 而异,因此将您的绑定(bind)设置为通用类型以获取您关心的列表。

private <T> List<? extends T> getListValueFromMap(Map<String, List<T>> map, String key) {
List<? extends T> list = map.get(key);
return list == null ? EMPTY_LIST : list;
}

请务必相应地更新您的 EMPTY_LIST 依赖项;显然在这种状态下,您不能返回以 Object 为界的列表。

这样做的好处是允许您使用任何提供的类型传递您的列表,并且由于通用参数在列表中完成的方式。

关于带有通配符的 Java 泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36590636/

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