在使用 Room 時,我在遍歷應該包含預期類型對象的列表的代碼中遇到了 ClassCastException。請參閱所附代碼中的“FIXME”注釋。我試過使用PersonandPersonEntity而不是? extends Person,但結果沒有變化。基于 Room 示例,我使用存儲庫作為 DAO 和 ViewModel 之間的中介。一個單獨的線程用于插入組信息和成員。來自異常的堆棧跟蹤:E/AndroidRuntime:致命異常:AsyncTask #1 進程:myproject,PID:7323 java.lang.RuntimeException:在 java.os.AsyncTask$3.done(AsyncTask.java:318) 處執行 doInBackground() 時發生錯誤。 util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:223) 在 java.util.concurrent.FutureTask.run(FutureTask.java:242) 在 android .os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 607)在 java.lang.Thread.run(Thread.java:761)引起:java.lang.ClassCastException:java.lang。整數無法在 myproject.persist.Repository$insertGroupTask.doInBackground(Repository.java:609) 在 myproject.persist.Repository$insertGroupTask.doInBackground(Repository.java:583) 在 android.os.AsyncTask $2.call(AsyncTask.java:304) 在 java.util.concurrent.FutureTask.run(FutureTask.java:237)此類在存儲庫類中private static class insertGroupTask extends AsyncTask<GroupEntity, Void, Void>{ private GroupDAO mAsyncTaskDao; insertGroupTask(GroupDAO dao) { mAsyncTaskDao = dao; } @Override protected Void doInBackground (final GroupEntity... params) { mAsyncTaskDao.insert(params[0]); // Add group members. List<? extends Person> members = params[0].getMembers(); if (members == null || members.size() == 0) return null; // FIXME: A ClassCastException occurs (Integer instead of Person). for (Person p : members) // FIXME: How can members be a list containing Integer objects? See getMembers() in GroupEntity { mAsyncTaskDao.addGroupMember(params[0].getId(), p.getId()); } return null; }}
1 回答

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
我的錯。我發現 setter 方法 setMembers(List members) 實際上是在一個用例中獲取成員 ID(整數)列表,其中列表是從 Map 中檢索的。我對泛型中類型擦除的新理解是,即使類型在泛型中定義用于編譯,它在運行時也被視為“對象”。因此,List 本身的任何轉換都不會失敗。第一個類型檢查是在訪問列表中的項目時(在本例中,它在創建后相對較長)。
添加回答
舉報
0/150
提交
取消