我有一个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
返回被自动装箱为Boolean
的boolean
。你的else子句正在创建一个LinkedList,调用一个返回布尔值的方法(add
),并将结果自动装箱的布尔值放入映射中。
你知道泛型吗?您应该键入w作为Map<String,List<String>>
,而不仅仅是Map。如果您这样做了,这个错误将在编译时被捕获。