我有List<Base>
包含多个实现的所有对象,例如Foo
或Bar
。
我如何提取完整列表的子集以获得所有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;
}
如何改进?
答案 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 Foo
或Foo extends Bar
,如果getFoos()
同时包含getBars()
,则同时ClassCastException
和bases
同时保留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));
}