如何从超级列表中对某些类对象的列表进行子集化?

时间:2013-04-01 19:31:50

标签: java oop

我有List<Base>包含多个实现的所有对象,例如FooBar。 我如何提取完整列表的子集以获得所有Foo s?

以下作品但非常难看(代号,类型转换等)。

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;
}

如何改进?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

将单独的类型与get-go分开存储,并在需要时为组合列表提供视图。 Guava's Iterables#concat()对于创建此类视图非常有用。


旁注:

除非Bar extends FooFoo extends Bar,如果getFoos()同时包含getBars(),则同时ClassCastExceptionbases同时保留Foo }和Bar个实例。


回应digitaljoel和路易斯的评论:

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

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