1

一番下に私の質問を投稿します。

以下は、他のクラスが拡張されたクラスです。

public class people {

    class family extends people {   
    }

    class friends extends people {  
    }

    class coworkers extends people {    
    }
}

以下は、選択クラスの getMembers() メソッドによって呼び出されるメソッド getAllPeopleByClass を持つクラスです。

public class processing {

static processing process = null;
private Collection<family> familyList = new ArrayList<family>();
private Collection<coworkers> cowList = new ArrayList<coworkers>();
private Collection<friends> friendList = new ArrayList<friends>();

public processing(){
}

public static processing getInstance() {
    if (process == null)
        process = new processing();
    return process;
}

public <T> Collection<people> getAllPeopleByClass(Class<T> clazz) {
    Collection<people> peopleCollection;
    peopleCollection.addAll(getList(clazz));
    return peopleCollection;
}

private <T> Collection<? extends people> getList(Class<T> clazz) {
    if (clazz == family.class) {  
        return familyList;  
    } else if (clazz == coworkers.class) {
        return cowList;
    } else { // else if clazz == friends.class
        return friendList;
    }
}

最後に、処理を使用するクラス:

 public class familySelection {
  public Collection<family> getMembers() {
    Collection<family> f;
    f = processing.getInstance().getAllPeopleByClass(family.class); //type mismatch
    return f; 
  }
}

 public class coworkerSelection {
  public Collection<coworkers> getMembers() {
    Collection<coworkers> c;
    c = processing.getInstance().getAllPeopleByClass(coworkers.class); //type mismatch
    return c;
  }
}


public class friendsSelection {
  public Collection<friends> getMembers() {
    Collection<friends> f;
    f = processing.getInstance().getAllPeopleByClass(friends.class); //type mismatch
    return f;
  }
}

私の問題は、各 getMembers() メソッドの getAllPeopleByClass 呼び出しから型の不一致が発生することです。

私はこれを試しました:

public class familySelection {
  public Collection<family> getMembers() {
    Collection<? extends people> f; //changed to extend from people
    f = processing.getInstance().getAllPeopleByClass(family.class);
    return (Collection<family>) f; //cast warning - dont want that
  }
}

これは機能しますが、キャスト警告が表示されますが、これは望ましくなく、抑制したくありません。これは、私が問題を解決するのに最も近いものです。また、getMembers() の戻り値の型はそのままにしておく必要があります。誰にも警告なしでこれを行う方法がありますか? または、どういうわけかこれを一般的に処理しますか?ありがとう!

4

3 に答える 3

2
public <T> Collection<T> getAllPeopleByClass(Class<T> clazz) {
    Collection<T> peopleCollection = new ArrayList<T>();
    for(people p : getList(clazz)) {
      peopleCollection.add(clazz.cast(p));
    }
    return peopleCollection;
}
于 2013-06-19T14:40:42.430 に答える
1

super次のキーワードを使用します。

public class familySelection {
  public Collection<? super family> getMembers() {
    Collection<? super family> f;
    f = processing.getInstance().getAllPeopleByClass(family.class);
    return f;
  }
}

UPD:構造にのみ値を指定するsuper場合は、ワイルドカードを使用してください。構造体以外の値のみを指定する場合はput、ワイルドカードを使用してください。と の両方を使用する場合は、ワイルドカードを使用しないでください。extendsgetgetput

于 2013-06-19T14:45:34.843 に答える