java.lang.Boolean нельзя преобразовать в java.util.LinkedList - PullRequest
6 голосов
/ 06 декабря 2011

У меня есть 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 ]

11 голосов
/ 06 декабря 2011

Попробуйте вместо этого:

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

Проблема, как вы можете видеть, была в строке, которая добавляет новый элемент на карту - метод add возвращает логическое значение, и это то, что было добавлено на карту. Приведенный выше код устраняет проблему и добавляет на карту то, что вы намеревались - 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);
    }
}

EDIT

Согласно комментариям ниже - при условии, что вы на самом деле можете заменить LinkedList на ArrayList (что может быть быстрее для некоторых операций) и что только * Специфический метод 1025 *, который вы используете - 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);
    }
}
6 голосов
/ 06 декабря 2011

List.add возвращает boolean, который автоматически помещается в Boolean.Ваше предложение else создает LinkedList, вызывает для него метод (add), который возвращает логическое значение, и помещает полученное в результате автоматически упакованное логическое значение в карту.

Знаете ли вы о генериках?Вы должны ввести w как Map<String,List<String>> вместо карты.Если бы вы сделали это, эта ошибка была бы обнаружена во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...