如何将 List<Map<?, ?>> 转换为 List<Map<String, String>>?

How to cast List<Map<?, ?>> into List<Map<String, String>>?

我正在制作 bukkit 插件和一个函数 returns List<Map<?, ?>>,如果我这样做:

List<Map<String, String>> circle = FileManager.area.getMapList("circles");

我收到无法转换的错误消息。做什么?

错误:

List<Map<?, ?>> cannot be converted into List<Map<String, String>>

getMapListreturns类型List<Map<?, ?>> into List<Map<String, String>>。由于泛型是不变的,因此您需要匹配类型

List<Map<?, ?>> circle = FileManager.area.getMapList("circles");

您可以通过转换为原始类型来抛弃所有泛型,(List):

List<Map<String, String>> circle = (List) FileManager.area.getMapList("circles");

请注意,与大多数强制转换一样,这是不安全的 - 最好找到一种方法来传递正确的类型信息,正如其他答案所建议的那样。

Map<String, String>Map<?, ?> 的子类型,但由于泛型不是不变的,这并不意味着 List<Map<String, String>>List<Map<?, ?>>.[=24= 的子类型]

如果您确定所有键和值都是 String 个实例,您可以这样做

List<Map<String, String>> circle = (List<Map<String, String>>) (Object) FileManager.area.getMapList("circles");

但是我不推荐它,因为如果任何键或值不是 Strings 你以后可能会得到 ClassCastException,所以你放弃了泛型的保证应该提供。

另一种方法是创建 new ArrayList<Map<String, String>>() 并遍历 List<Map<?, ?>>,然后使用 instanceof 检查每个 Map<?, ?> 中的所有键和值是否 String。只有当 instanceof 检查成功时,您才应该添加该条目。

主要用于从某些定义的值进行分配,例如: 映射 m = new HashMap();

而且 using 不好,因为你需要显式地转换它(这意味着你事先知道你的运行时类型)。

通常你明确指定 return values.So 让我们分情况看:

1) 您想编写非常通用的函数来获取字符串和 returns List>,那么您可以这样写

<K, V> List<Map<K, V>> getMapList(String s) {
      ... 
} 

Java 将根据您分配给什么来推断 K、V 的类型。

2) 你想要 return 一些特定的类型,然后使用那个类型:

<Integer, String> List<Map<Integer, String>> getMapList(String s) {
      ... 
}