无法转换HashMap

时间:2018-05-11 21:07:13

标签: java

我从以下来源收到以下错误。有人可以帮忙吗?

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.TreeMap

我认为问题在于:

TreeMap functionResources = (TreeMap) ((Map) 
            AbstractParameterManager.getResource(resourceId)).get(function);
public abstract class AbstractParameterManager implements ParameterManager {
    protected static final Map resourceLocations = 
        ResourceLocator.locateResources();
    protected static final Map resources = new TreeMap();
    protected final Map overrides = new TreeMap();


    protected static Object getResource(String resourceId) {
        Map resourceMap = (Map) resources.get(resourceId);
        if (resourceMap == null) {
            resourceMap = new TreeMap();
            resources.put(resourceId, resourceMap);
        }
        return resourceMap;
    }

    protected static Map getResource(String resourceId, String function) {
        TreeMap functionResources = (TreeMap) ((Map) 
                AbstractParameterManager.getResource(resourceId)).get(function);
        if (functionResources == null) {
            functionResources = new TreeMap();
            ((Map) 
                      AbstractParameterManager.getResource(resourceId)).put(function, 
                      functionResources);
        }
        return functionResources;
    }

3 个答案:

答案 0 :(得分:0)

不允许将TreeMap强制转换为HashMap。 您应该遵循一般准则,在该准则中首先检查引用变量是否具有特定类型,然后才执行强制转换。

一般来说,我们从层次结构中的超类型转换为子类型,以使用子类型提供的特定方法。

因此,在这种情况下,您可以将TreeMap转换为Map,或将HashMap转换为Map,但从TreeMap转换为HashMap或反之亦然无效。

答案 1 :(得分:0)

您可以在实例化TreeMap时将映射作为参数传递,而不是尝试将Map作为TreeMap进行类型转换。

e.g:

public static void main(String[] args) {
    Map<String, String> hashMap = new HashMap<>();
    hashMap.put("a", "a");
    hashMap.put("c", "c");
    hashMap.put("b", "b");
    Map<String, String> treeMap = new TreeMap<>(hashMap);
    treeMap.forEach((k, v) -> {
        System.out.println(k + " | " + v);
    });
}

输出:

a = a
b = b
c = c

在您的情况下,您必须替换以下行:

TreeMap functionResources = (TreeMap)((Map)AbstractParameterManager.getResource(resourceId)).get(function);

通过

Map functionResources = new TreeMap((Map)AbstractParameterManager.getResource(resourceId)).get(function);

既然已经回答了问题,那么您的代码还会遇到一些问题。您的方法getResource始终返回一张地图,即使它没有,当您将AbstractParameterManager.getResource(resourceId)作为地图进行类型转换时,您还会遇到其他错误。我强烈建议您将getResource的返回类型更改为Map。

答案 2 :(得分:0)

public static void main(String [] args){

    Map<String, String> hashMap = new HashMap<String, String>();
    hashMap.put("a", "a");
    hashMap.put("c", "c");
    hashMap.put("b", "b");
    Map<String, String> treeMap = new TreeMap<>(hashMap);

    treeMap.forEach((k, v) -> {
        System.out.println(k + " | " + v);
    });

}

@TwiN初始化地图时出错