如何投射List <map <?,?=“”>&gt;进入List <map <string,string =“”>&gt;?</map <string,> </map <?,>

时间:2015-01-06 18:34:36

标签: java casting

我正在制作bukkit插件,如果我这样做,一个函数会返回List<Map<?, ?>>

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

我收到无法转换的错误。怎么办?

错误:

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

4 个答案:

答案 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) {
      ... 
}