Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带通配符的Java泛型类型_Java_Generics - Fatal编程技术网

带通配符的Java泛型类型

带通配符的Java泛型类型,java,generics,Java,Generics,我想写一个可以接受参数的方法: Map<String, [the type here could be anything]> 问题是,当我使用以下代码调用此方法时,Eclipse会告诉我一个错误,即给定参数的类型不适用 getListValueFromMap(cityNameMap, "key"); 错误是: 方法getListValueFromMap(Map您可以执行以下操作: private <T> List<T> getListValueFromMa

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

Map<String, [the type here could be anything]>
问题是,当我使用以下代码调用此方法时,Eclipse会告诉我一个错误,即给定参数的类型不适用

getListValueFromMap(cityNameMap, "key");
错误是:

方法getListValueFromMap(Map您可以执行以下操作:

private <T> List<T> getListValueFromMap(Map<String, List<T>> map, String key) {
    //
}
私有列表getListValueFromMap(映射映射,字符串键){
//
}

两者都没有给我的IDE(IntelliJ 2016.1.1)带来任何问题,但可能是您的IDE有不同的设置。

重要的是要注意
?extends Object
在泛型中实际代表了什么

在它当前的咒语中,它是一个上界为
对象
的列表。理想情况下,这意味着您可以使用它中的任何列表,但由于泛型是不变的,所以这里根本不是这种情况-您只能使用具有相同边界的列表

由于列表的包含类型可能会随着映射的不同而变化,因此将您的绑定设置为泛型类型以获取您关心的列表

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;
}

private list
cityNameMap
是如何定义的?像这样定义cityNameMap
map
Collections有什么意义?不可修改列表(new ArrayList();
?如果你已经知道
Collections
,为什么不使用
Collections.emptyList())
?是的,这可以解决我的问题,只是我不能从方法中返回空的列表,除非我保持返回类型不变,但我认为真正的原因可能是,无论调用方在参数映射中给我什么类型的列表,都只返回列表的单例实例存在一些设计问题,我仍然非常关心我最初无法调用该方法的原因是~public static final List EMPTY\u List=new ArrayList();适用于我如果您仍然想使用代码,请参阅Makoto的答案以了解更多信息。您可以尝试这样声明您的cityNameMap:MapI我想我有些理解您的话,因为编译器无法判断空列表的正确习惯用法的真正类型是
Collections.emptyList()
仍将返回单例
集合。空列表
,但现在不需要抑制“未检查”警告。从Java 8开始,您可以省略
,只需使用
集合。emptyList()
。顺便说一句,泛型并不是在所有情况下都是不变的,因此使用
map顺便说一句,将map的
列表
转换为
List@Holger:是的,但OP似乎希望该列表是一个生产者,以其泛型的设置方式,所以我只是保留了该行为
List
List您不应该依赖于泛型签名的不变性。
Collections.swap
仍然可以用这样的列表调用,因此可以
remove
。因此我建议如下:“应该避免使用通配符作为返回类型,因为它会迫使程序员使用代码来处理通配符。”
/** map city's name to city list */
private Map<String, List<City>> cityNameMap;
private <T> List<T> getListValueFromMap(Map<String, List<T>> map, String key) {
    //
}
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;
}