2013-04-02 2 views
1

У меня есть список супер типов и вы хотите отфильтровать все объекты определенного класса реализации.Как фильтровать список по классам?

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

List<Base> list; 

Поскольку я использую GWT, Guava поддерживается только частично. Таким образом, я не могу использовать следующую команду, которая будет работать иначе в простом 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 .., он автоматически фильтруется классом BASE для вас. Но если вы хотите, чтобы определенные в соответствии с подклассами класса BASE, как вы упомянули в приведенном выше примере, это будет невозможно. .

+0

Как я уже упоминал выше, используя гуавы можно acchieve этот фильтр результат по классу. – membersound

Смежные вопросы