2013-04-02 35 views
1

我有一個超類型的列表,並且想過濾所有具體實現類的對象。如何按類過濾列表?

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

List<Base> list; 

正如我使用GWT,番石榴只是部分支持。因此,我不能使用以下,這在普通的Java,否則工作:

Lists.newArrayList(Iterables.filter(list, Bar.class)); 

我怎麼能與GWT替換此兼容性?

回答

6
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); 
     } 
    } 
-2

當您使用泛型類型BASE..it將通過爲您的基類自動過濾。但是,如果你想具體根據基類的子類,你在上面example..it提到將是不可能的。 。

+0

正如我上面提到的,使用番石榴可以acchieve此過濾器班結果。 – membersound