转换回原始类时出现ClassCastException错误
我有以下代码:
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
从Playinheritance了这个方法! Framework的Model类,如果重要的话。 这就是为什么它返回一个Object
而不是MyObj
的列表,我无法改变它的工作原理。
那么,有什么理由让我无法回到MyObj
吗? 我可以看到如何从Object
回放一些奇怪的东西,但Java似乎知道对象的类曾经是什么。
谢谢!
看起来你有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 } }
我在StackOverflow上看到了一篇最近的post,表明如果同一个类的两个相同的实例被不同的类加载器加载,则不能在它们之间进行转换。
发布有问题
检查您是否也不受此多个类加载器条件的限制。
显然,从您的堆栈跟踪中,您的集合中还有其他类型的条目。 在循环中使用o.getClass().getName()
来知道什么是.all().fetch()
真正返回。
注意 :也许是一些model.Survey
对象?