Java中使用for-each循环的类型转换问题

4

我追踪了一下我正在开发的应用程序中出现的问题,它给了我一个类型转换异常。有趣的是,它说无法将"entities.Movie"强制转换为"entities.Movie"?!movies是一个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);
         }
     }

同意Péter的观点,换句话说,检查一下你的导入。 - The Student
听起来像是一个Web应用程序。如果是这样的话,1)不要打印异常,而是抛出它们。2)不要在servlet /业务层中打印HTML,使用JSP。 - BalusC
6个回答

7
听起来像是类加载器冲突。当不同的类加载器加载相同的类定义时,JVM会将其视为两个不同的类。
根据这些简单的信息,没有更多可说的了。请参阅此文章以了解有关类加载器及其问题的详细信息。
还可以查看我之前回答的类似问题的答案

4
可能是类加载器问题(如果您的应用程序有多个)
在调试器中,查看从getClass()调用获得的Class对象,比较它和本地构造的Movie对象的Class对象。
如果它们不同,这可能会帮助您跟踪发生了什么。 class对象将允许您查看哪个类加载器已加载定义。
如果您加载了两个不同的类定义,则需要找出JAR文件被加载两次的位置。

0
除了类加载器问题之外,我怀疑你在某个地方还进行了一些不安全的类型转换,涉及到一个Collection<Movie>实例或类似的情况。

0

请检查这两个类是否使用相同版本的Java编译。


1
类可以使用不同的版本进行编译,而不会导致“ClassCastException”。但是,如果您使用更新的版本进行编译并尝试在早期的JVM上运行,则会出现“UnsupportedClassVersionError”。 - Kevin Brock

0
我也怀疑是类加载器的问题,但你也可以检查一下是否存在serialversionuid的问题。

0

另一种可能性是,如果您有任何代码生成(例如从ORM中)正在进行,则IDE与磁盘上的文件不同步,因此刷新IDE项目并执行清理构建可能会有所帮助。

如果没有,您是否实际上有两个具有相同名称但位于不同包中的类? 如果是这样,那么尝试将一个转换为另一个可能是错误的,因为您导入了“错误”的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接