1

クラスの種類に問題があります。スーパークラス「食用」とインターフェース「カラフル」があります。すべての食用アイテムがカラフルであるとは限らないため、カラフルは特定の食用オブジェクトにのみ実装されます。食用アイテムの ArrayList を取得してループし、カラフルなものだけを含む新しい ArrayList を返そうとしています。私が今受け取っているエラーは

「ArrayList 型のメソッド add(Colorful) は、引数 (Edible) には適用できません」

この制限を回避するにはどうすればよいですか?

private ArrayList<Edible> elist;
private ArrayList<Colorful> clist;

public List<Colorful> getColorfulItems(){
    for(Edible x : elist)
        if(x instanceof Colorful){
            clist.add(x);
        }
    return clist;

    }
4

3 に答える 3

5

Edibleに型キャストする必要がありますColorful: -

if(x instanceof Colorful){
        clist.add((Colorful)x);
}

または、タイプケースを避けたい場合は、ArrayList を次のように宣言しますWildCard

private ArrayList<? extends Colorful> clist;

your をこのように宣言することで、なくArrayListても何でも追加できますsubtypeColorfultypecasting

また、リストは として宣言されているため、変更したリストを毎回返す必要はありませんinstance variable。そのため、リストを返さずに変更がリストに反映されます。

于 2012-10-15T15:55:55.530 に答える
1

タイプ の任意のオブジェクトを受け入れるようにリストを変更しますColorful詳細については、ジェネリック、継承、およびサブタイプをお読みください。

例:

private ArrayList<? extends Colorful> clist;
于 2012-10-15T15:56:20.387 に答える
0

フィールドを戻り値として使用することには抵抗があります。この場合、メソッドを呼び出すたびにリストが大きくなり、望ましくない可能性があります。

メソッドをより一般的にすることができます

@SuppressWarnings("unchecked")
public <T> List<T> selectItems(Class<T> clazz) {
    List<T> ret = new ArrayList<T>();
    for (Edible x : elist)
        if (clazz.isInstance(x))
            ret.add((T) x);
    return ret;
}

さまざまなタイプを選択するために使用できます。

List<Serializable> serializableList = x.selectItems(Serializable.class);
List<Colorful> colorfulList = x.selectItems(Colorful.class);
于 2012-10-15T16:01:15.767 に答える