web-dev-qa-db-ja.com

Iterableインターフェイスを実装するにはどうすればよいですか?

次のコードを使用して、ProfileCollectionタイプのオブジェクトを反復処理するにはどうすればよいですか?

public class ProfileCollection implements Iterable {    
    private ArrayList<Profile> m_Profiles;

    public Iterator<Profile> iterator() {        
        Iterator<Profile> iprof = m_Profiles.iterator();
        return iprof; 
    }

    ...

    public Profile GetActiveProfile() {
        return (Profile)m_Profiles.get(m_ActiveProfile);
    }
}

public static void main(String[] args) {
     m_PC = new ProfileCollection("profiles.xml");

     // properly outputs a profile:
     System.out.println(m_PC.GetActiveProfile()); 

     // not actually outputting any profiles:
     for(Iterator i = m_PC.iterator();i.hasNext();) {
        System.out.println(i.next());
     }

     // how I actually want this to work, but won't even compile:
     for(Profile prof: m_PC) {
        System.out.println(prof);
     }
}
52
Dewayne

Iterableは汎用インターフェースです。あなたが持っているかもしれない問題(あなたが実際にあなたが持っている問題を言っていません)は、タイプ引数を指定せずにジェネリックインターフェース/クラスを使用すると、無関係なジェネリックタイプのタイプを消去できることですクラス内。この例は、 ジェネリッククラスへの非ジェネリック参照により、非ジェネリックリターンタイプになります です。

したがって、少なくとも次のように変更します。

public class ProfileCollection implements Iterable<Profile> { 
    private ArrayList<Profile> m_Profiles;

    public Iterator<Profile> iterator() {        
        Iterator<Profile> iprof = m_Profiles.iterator();
        return iprof; 
    }

    ...

    public Profile GetActiveProfile() {
        return (Profile)m_Profiles.get(m_ActiveProfile);
    }
}

これは動作するはずです:

for (Profile profile : m_PC) {
    // do stuff
}

Iterableのtype引数がない場合、イテレータはObject型に縮小されるため、これだけが機能します。

for (Object profile : m_PC) {
    // do stuff
}

これはJava generics。

そうでない場合は、何が起こっているかについての詳細を提供してください。

59
cletus

最初に:

public class ProfileCollection implements Iterable<Profile> {

第二:

return m_Profiles.get(m_ActiveProfile);
4
TofuBeer