java.lang.Boolean不能转换为java.util.LinkedList

时间:2011-12-06 04:01:24

标签: java exception casting linked-list hashmap

我有一个HashMap,其中密钥的类型为String,其值为LinkedList类型的String

所以基本上,这就是我想要做的。

while (contentItr.hasNext()) {
    String word = (String) contentItr.next();
    if (wordIndex.containsKey(word)) {
        LinkedList temp = (LinkedList) w.get(word); //Error occurs here
        temp.addLast(currentUrl);
    } else {
        w.put(word, new LinkedList().add(currentUrl));
    }
}

我第一次添加键值对时,没有收到任何错误。但是,当我尝试检索与现有密钥关联的链接列表时,我得到以下异常:

java.lang.Boolean cannot be cast to java.util.LinkedList. 

我无法解释为什么会发生此异常。

2 个答案:

答案 0 :(得分:11)

请改为尝试:

while (contentItr.hasNext()) {
    String word = (String) contentItr.next();
    if (wordIndex.containsKey(word)) {
        LinkedList temp = (LinkedList) w.get(word);
        temp.addLast(currentUrl);
    } else {
        LinkedList temp = new LinkedList();
        temp.add(currentUrl);
        w.put(word, temp);
    }
}

正如您所看到的,问题在于向Map添加新元素的行 - 方法add返回一个布尔值,这就是添加到Map的内容。上面的代码修复了问题,并将您想要的内容添加到Map中 - 一个LinkedList。

另外,请考虑在代码中使用泛型类型,这样可以防止这样的错误。我会尝试猜测你的代码中的类型(必要时调整它们,你明白了),假设你在程序的某个地方有这些声明:

Map<String, String> wordIndex = new HashMap<String, String>();
Map<String, LinkedList<String>> w = new HashMap<String, LinkedList<String>>();

List<String> content = new ArrayList<String>();
Iterator<String> contentItr = content.iterator();

这样,您的问题中的代码片段可以安全地编写,避免不必要的强制转换和类型错误,如您所拥有的那样:

while (contentItr.hasNext()) {
    String word = contentItr.next();
    if (wordIndex.containsKey(word)) {
        LinkedList<String> temp = w.get(word);
        temp.addLast(currentUrl);
    } else {
        LinkedList<String> temp = new LinkedList<String>();
        temp.add(currentUrl);
        w.put(word, temp);
    }
}

修改

根据以下评论 - 假设您实际上可以LinkedList替换ArrayList(某些操作可能会更快)并且只有 LinkedList - 您正在使用的具体方法是addLast(这是add的同义词),上面的代码可以按如下方式重写,更多对象 - 使用接口而不是容器的具体类的定向样式:

Map<String, String> wordIndex = new HashMap<String, String>();
Map<String, List<String>> w = new HashMap<String, List<String>>();

List<String> content = new ArrayList<String>();
Iterator<String> contentItr = content.iterator();

while (contentItr.hasNext()) {
    String word = contentItr.next();
    if (wordIndex.containsKey(word)) {
        List<String> temp = w.get(word);
        temp.add(currentUrl);
    } else {
        List<String> temp = new ArrayList<String>();
        temp.add(currentUrl);
        w.put(word, temp);
    }
}

答案 1 :(得分:6)

List.add返回boolean,自动装箱到Boolean。你的else子句正在创建一个LinkedList,在其上调用一个返回布尔值的方法(add),并将生成的自动布尔布尔值放入地图中。

你知道泛型吗?您应该键入w作为Map<String,List<String>>,而不仅仅是Map。如果你这样做,那么这个错误就会在编译时被捕获。