0

我有一个List<Base>包含多个实现的所有对象,例如Fooor Bar。如何提取完整列表的子集以获取例如 all Foos?

以下工作但非常难看(重复代码,类型转换等)。

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 Fooor Foo extends Bar,同时调用getFoos()andgetBars()保证抛出一个ClassCastExceptionifbases包含两个FooandBar实例。


回应 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 回答