我正在制作bukkit插件,如果我这样做,一个函数会返回List<Map<?, ?>>
:
List<Map<String, String>> circle = FileManager.area.getMapList("circles");
我收到无法转换的错误。怎么办?
错误:
List<Map<?, ?>> cannot be converted into List<Map<String, String>>
答案 0 :(得分:6)
您可以通过强制转换为原始类型(List)
:
List<Map<String, String>> circle = (List) FileManager.area.getMapList("circles");
请注意,与大多数演员一样,这是不安全的 - 如其他答案所示,找到传递正确类型信息的方法会更好。
答案 1 :(得分:1)
getMapList
返回List<Map<?, ?>> into List<Map<String, String>>
类型。由于泛型是不变的,因此您需要匹配类型
List<Map<?, ?>> circle = FileManager.area.getMapList("circles");
答案 2 :(得分:1)
Map<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
s,你可能会在ClassCastException
之后得到new ArrayList<Map<String, String>>()
,所以你扔掉了泛型应该保证的保证提供。
另一种方法是创建List<Map<?, ?>>
并迭代instanceof
,然后使用Map<?, ?>
检查每个String
中的所有键和值{{1 }}。仅当instanceof
检查成功时才应添加条目。
答案 3 :(得分:0)
主要用于从某些定义的值中分配,例如: Map m = new HashMap();
使用并不好,因为你需要显式地转换它(这意味着你事先知道你的运行时类型)。
通常你明确指定返回值。所以让我们看一下案例:
1)你想写非常通用的函数,它获取字符串并返回List&gt;然后就可以这样写了
<K, V> List<Map<K, V>> getMapList(String s) {
...
}
Java将推断出K,V的类型,具体取决于您分配的内容。
2)您想要返回某种特定类型,然后使用该类型:
<Integer, String> List<Map<Integer, String>> getMapList(String s) {
...
}