1

public Set<ProjectItem> projectItems = new HashSet<ProjectItem>();は2種類のクラスを含むことができる を持っています(ProjectItemは両方の抽象スーパークラスです)。クラスはDeliverableTaskです。Deliverableからクラスのすべてのオブジェクトを取得したいSet。したがって、私はこれを書きます:

public Set<Deliverable> allDeliverables(){
Set<Deliverable> result = new HashSet<Deliverable>();
for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext(); iter.next()){
    if (iter.next().getClass() == Deliverable.class){
    Deliverable del = (Deliverable) iter.next();
    result.add(del);
    }
}
return result;
}

しかし、これは例外です -

スレッド「メイン」の例外 java.lang.ClassCastException: edu.Chryb.ProjectManagement.Task を edu.Chryb.ProjectManagement.Deliverable にキャストできません

次の行で:Deliverable del = (Deliverable) iter.next();

if クエリに何か問題がありますか?

いつも助けてくれてありがとう。

4

3 に答える 3

3

問題は、ループ内での複数回の呼び出しですiter.next()(現在の要素を返し、カーソルを次の要素に転送するため)。

ループ内で、最初に次のようにします-

for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext();){
    ProjectItem currItem = iter.next();
    //...

そして、複数回currItem呼び出す代わりに使用します。iter.next()


サイドノート:

for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext(); iter.next()) {

呼び出しiter.next()は、言及された問題とは関係ありませんが、そこにあるべきではありません。そのため、実際の現在の要素をスキップします。

于 2013-05-31T18:34:56.150 に答える