为什么我得到ClassCastException?

时间:2015-05-17 15:28:43

标签: java

所以我的构造函数看起来如此:

public Group(Entry<String, List<String>> rawGroup) {
    permission=rawGroup.getKey();

    List<String> params = rawGroup.getValue();

    limits = Integer.parseInt(params.get(0));
    int a = Integer.parseInt(params.get(1));
    int b = Integer.parseInt(params.get(2));
    s1 = Math.min(a, b);
    s2 = Math.max(a, b);
}

并且“List params = rawGroup.getValue();”这样做:

java.lang.ClassException:java.lang.String无法强制转换为java.util.List

我无法理解为什么会发生这种情况,getValue()无法返回String,因为它不是String

UPDATE:Entry是EntrySet的一部分,它返回Map

UPDATE2: 所以这里是使用该构造函数的代码 -

    Map<String, List<String>> rawGroups = (Map) holder.config.getConfigurationSection(HEADING).getValues(true);
    for (Entry<String, List<String>> rawGroup : rawGroups.entrySet()) {
        groups.add(new Group(rawGroup));
    }

1 个答案:

答案 0 :(得分:2)

关键是:

Map<String, List<String>> rawGroups = (Map) holder.config.getConfigurationSection(HEADING).getValues(true);

您已假设holder.config.getConfigurationSection(HEADING).getValues(true)返回的是Map<String, List<String>>,并告诉编译器也要做出这样的假设。显然情况并非如此,因为当你试图以这种方式使用它时,它会失败。

您需要找出holder.config.getConfigurationSection(HEADING).getValues(true) 真正返回的内容,并使用它。

这里简单演示了相同的基本概念(live copy):

public static void main (String[] args)
{
    Map<String, List<String>> m = (Map)getMap();
    try {
        System.out.println(m.get("entry").get(0)); // Fails here
    }
    catch (Exception e) {
        System.out.println("Failed: " + e.getMessage());
        e.printStackTrace(System.out);
    }
}
static Object getMap() {
    Map m = new HashMap();
    List l = new LinkedList();
    l.add(42);
    m.put("entry", l);
    return m;
}