我正在制作bukkit插件,其中一个函数返回List<Map<?, ?>>
,如果我想实现这个:
List<Map<String, String>> circle = FileManager.area.getMapList("circles");
我收到了一个错误提示,说无法转换。该怎么办?
错误信息如下:
List<Map<?, ?>> cannot be converted into List<Map<String, String>>
我正在制作bukkit插件,其中一个函数返回List<Map<?, ?>>
,如果我想实现这个:
List<Map<String, String>> circle = FileManager.area.getMapList("circles");
List<Map<?, ?>> cannot be converted into List<Map<String, String>>
(List)
来摆脱所有通用性:List<Map<String, String>> circle = (List) FileManager.area.getMapList("circles");
getMapList
返回类型 List<Map<?, ?>>
,需要转换为 List<Map<String, String>>
。由于泛型是不变的,您需要匹配类型。
List<Map<?, ?>> circle = FileManager.area.getMapList("circles");
List<Map<Object, Object>>
吗? - Maroun?
是一个源集合,PECS等。 - ReimeusMap<String, String>
是Map<?, ?>
的子类型,但由于泛型不是不变的,这并不意味着List<Map<String,String>>
是List<Map<?,?>>
的子类型。
如果您确定所有键和值都是String
实例,则可以这样做
List<Map<String, String>> circle = (List<Map<String, String>>) (Object) FileManager.area.getMapList("circles");
String
,你可能会在之后遇到 ClassCastException
,这样就丢失了泛型应该提供的保证。new ArrayList<Map<String, String>>()
并迭代 List<Map<?, ?>>
,然后使用 instanceof
检查每个 Map<?, ?>
中的所有键和值是否都是 String
。只有当 instanceof
检查成功时才应该添加条目。主要用于将一些定义值赋给变量,比如:
Map m = new HashMap();
而使用 不好,因为需要显式转换类型(这意味着你事先知道运行时的类型)。
通常你会明确指定返回值。因此,让我们来看看几种情况:
1)你想编写非常通用的函数,它接收字符串并返回 List>,那么可以像这样编写:
<K, V> List<Map<K, V>> getMapList(String s) {
...
}
Java将推断K,V的类型,具体取决于您要分配给什么。
2)如果您想返回某个特定类型,则使用该类型:
<Integer, String> List<Map<Integer, String>> getMapList(String s) {
...
}