如何将 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>>
getMapList
returns类型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");
但是我不推荐它,因为如果任何键或值不是 String
s 你以后可能会得到 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) {
...
}
我正在制作 bukkit 插件和一个函数 returns List<Map<?, ?>>
,如果我这样做:
List<Map<String, String>> circle = FileManager.area.getMapList("circles");
我收到无法转换的错误消息。做什么?
错误:
List<Map<?, ?>> cannot be converted into List<Map<String, String>>
getMapList
returns类型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");
但是我不推荐它,因为如果任何键或值不是 String
s 你以后可能会得到 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) {
...
}