0

またはList<Base>のようないくつかの実装のすべてのオブジェクトを含む があります。たとえば、すべての s を取得するために、完全なリストのサブセットを抽出するにはどうすればよいですか?FooBarFoo

以下は機能しますが、非常に醜いです (コードの重複、型キャストなど)。

class Base;
class Foo extends Base;
class Bar extends Base;

List<Base> bases;

List<Foo> getFoos() {
    List<Foo> foos = new ArrayLista<Foo>();
    for (Base base : bases) {   
        foos.add((Foo) base);
    }

    return foos;
}

List<Bar> getBars() {
    List<Bar> Bars = new ArrayLista<Bar>();
    for (Base base : bases) {   
        Bars.add((Bar) base);
    }

    return Bars;
}

これはどのように改善できますか?

4

2 に答える 2

3

これを試して、

private <T extends Base> List<T> getSubType(Class<T> type)
{
    List<T> list = new ArrayList<T>();
    for (Base b : bases)
    {
        if (b.getClass().isAssignableFrom(type))
        {
            list.add((T) b);
        }
    }

    return list;
}
于 2013-04-01T19:38:34.903 に答える
2

別々のタイプを最初から別々に保存し、必要なときに結合されたリストにビューを提供します。Guava'sIterables#concat()は、そのようなビューを作成するのに役立ちます。


サイドノート:

またはのBar extends Foo場合を除き、両方のandFoo extends Barを呼び出すと、 and の両方のインスタンスが含まれる場合に必ず例外がスローされます。getFoos()getBars()ClassCastExceptionbasesFooBar


digitaljoel と Louis のコメントへの対応:

List<Foo> getFoos() {
    return Lists.newArrayList(Iterables.filter(bases, Foo.class));
}

List<Bar> getBars() {
    return Lists.newArrayList(Iterables.filter(bases, Bar.class));
}
于 2013-04-01T19:34:09.570 に答える