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



我有一个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. 

我没有一个可能的解释为什么这个异常发生。

试试这个:

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);
    }
}

编辑

根据下面的注释-假设您实际上可以ArrayList替换LinkedList(对于某些操作可能更快),并且您正在使用的 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);
    }
}

List.add返回被自动装箱为Booleanboolean。你的else子句正在创建一个LinkedList,调用一个返回布尔值的方法(add),并将结果自动装箱的布尔值放入映射中。

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

相关内容

  • 没有找到相关文章

最新更新