簡體   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