繁体   English   中英

转换回原始类时出现ClassCastException错误

[英]ClassCastException error when casting back to original class

我有以下代码:

public void doJob() {
    MyObj s;

    for ( Object o : MyObj.all().fetch()) {
        s = (MyObj) o;  // ClassCastException here

        if (!s.fileExists()) {
        //Do some stuff
        }
    }
}

抛出这个异常:

play.exceptions.JavaExecutionException: models.MyObj cannot be cast to models.MyObj
    at play.jobs.Job.call(Job.java:155)
    at Invocation.Job(Play!)
Caused by: java.lang.ClassCastException: models.MyObj cannot be cast to models.MyObj
    at jobs.OrphanSurveys.doJob(OrphanSurveys.java:18)
    at play.jobs.Job.doJobWithResult(Job.java:50)
    at play.jobs.Job.call(Job.java:146)
    ... 1 more

(如果重要,此方法在Play Job类中运行。)

MyObj.all().fetch()返回一个包含数据库中所有MyObj对象的Iterable。 MyObj从Play继承了这个方法! Framework的Model类,如果重要的话。 这就是为什么它返回一个Object而不是MyObj的列表,我无法改变它的工作原理。

那么,有什么理由让我无法回到MyObj吗? 我可以看到如何从一个Object抛出一些古怪的东西,但Java似乎知道对象的类曾经是什么。

谢谢!

我在StackOverflow上看到了一篇最近的帖子,表明如果同一个类的两个相同的实例被不同的类加载器加载,则不能在它们之间进行转换。

发布有问题

检查您是否也不受此多个类加载器条件的限制。

看起来你有ClassLoader问题。 fetch()方法返回的对象被加载到与当前线程中用于尝试和转换的不同的ClassLoader中。

试试这个确认。 将三行代码添加到您的现有代码中。

for ( Object o : MyObj.all().fetch()) {
    // Check classloaders
    System.out.println(o.getClass().getClassLoader());
    System.out.println(MyObj.class.getClassLoader());
    break;
    //
    s = (MyObj) o;  // ClassCastException here

    if (!s.fileExists()) {
    //Do some stuff
    }
}

显然,从您的堆栈跟踪中,您的集合中还有其他类型的条目。 在循环中使用o.getClass().getName()来知道什么是.all().fetch()真正返回。

注意 :也许是一些model.Survey对象?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM