带通配符的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 listcityNameMap
是如何定义的?像这样定义cityNameMapmapCollections有什么意义?不可修改列表(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;
}