我有一個超類型的列表,並且想過濾所有具體實現類的對象。如何按類過濾列表?
class Base;
class Bar extends Base;
class Foo extends Base;
List<Base> list;
正如我使用GWT,番石榴只是部分支持。因此,我不能使用以下,這在普通的Java,否則工作:
Lists.newArrayList(Iterables.filter(list, Bar.class));
我怎麼能與GWT替換此兼容性?
我有一個超類型的列表,並且想過濾所有具體實現類的對象。如何按類過濾列表?
class Base;
class Bar extends Base;
class Foo extends Base;
List<Base> list;
正如我使用GWT,番石榴只是部分支持。因此,我不能使用以下,這在普通的Java,否則工作:
Lists.newArrayList(Iterables.filter(list, Bar.class));
我怎麼能與GWT替換此兼容性?
Iterables#filter(Iterable<?> unfiltered, Class<T> type)
和
Predicates#instanceOf(Class<?> clazz)
是GWT不兼容,因爲Class#isInstance(Object obj)
是GWT不支持的,因爲它違背了GWT編譯器優化和GWT試圖遠離反射了。
的instanceof
關鍵字是可用的,雖然。所以下面將工作:
Iterables.filter(list, new Predicate<Base>() {
@Override
public boolean apply(Base input) {
return input instanceof Bar;
}
});
這就是說,它可能是更容易/清潔劑來寫(見Guava wiki caveats):
List<Bar> bars = Lists.newArrayList();
for (Base base : list) {
if (base instanceof Bar) {
bars.add((Bar) base);
}
}
當您使用泛型類型BASE..it將通過爲您的基類自動過濾。但是,如果你想具體根據基類的子類,你在上面example..it提到將是不可能的。 。
正如我上面提到的,使用番石榴可以acchieve此過濾器班結果。 – membersound