Проблема приведения типов в цикле java for-each - PullRequest
3 голосов
/ 20 мая 2010

Я обнаружил проблему с разрабатываемым приложением, оно дает мне исключение приведения типа. Забавно то, что он не может разыгрывать «сущности. фильмы - это ArrayList.

    try {
        movies = getMovies();
    } catch (Exception e) {
        e.printStackTrace(System.out);
    } finally {
        try {
            for (Movie movie : movies) {
                output.append("                 <tr>\n");
                output.append("                     <td>" + movie.getId() + "</td>");
                output.append("                 </tr>\n");
            }
         } catch (Exception e) {
             e.printStackTrace(System.out);
         }
     }

Ответы [ 6 ]

7 голосов
/ 20 мая 2010

Звучит как конфликт с загрузчиком классов. Одно и то же определение класса, загруженное разными загрузчиками классов, JVM рассматривает как два разных класса.

С этой маленькой информацией больше нечего сказать. См. эту статью для получения подробной информации о загрузчиках классов и их проблемах.

Смотрите также этот мой более ранний ответ на аналогичную проблему .

4 голосов
/ 20 мая 2010

Возможно, проблема с загрузчиком классов (если в вашем приложении их больше одного)

В отладчике взгляните на объекты Class из вызова getClass () для элемента movie и сравните его с объектом для объекта Movie, созданного локально.

Если они разные, это может позволить вам проследить, что происходит. Объект класса позволит вам увидеть, какой загрузчик классов загрузил определение.

Если у вас загружены два разных определения классов, вам необходимо отследить, куда загружается ваш JAR-файл дважды.

0 голосов
/ 20 мая 2010

Другая возможность, если у вас есть какая-либо генерация кода (например, из ORM), заключается в том, что IDE не в ногу с файлами на диске, и в этом случае может помочь обновление проекта IDE и выполнение чистой сборки.

Если нет, то есть ли у вас два класса с одинаковыми именами в разных пакетах? Если это так, то это может быть попытка привести от одного к другому, поскольку вы импортировали «неправильный».

0 голосов
/ 20 мая 2010

Я также подозреваю, что проблема с загрузчиком классов, но вы также можете проверить, что у вас нет проблемы с serialversionuid.

0 голосов
/ 20 мая 2010

Убедитесь, что оба класса были скомпилированы с одной и той же версией Java.

0 голосов
/ 20 мая 2010

В дополнение к проблеме загрузчика классов, я подозреваю, что вы также делаете некоторые небезопасные преобразования типов где-то с использованием экземпляра Collection<Movie> или аналогичного.

...