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 兼容?

4

2 回答 2

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 警告):

    List<Bar> bars = Lists.newArrayList();
    for (Base base : list) {
        if (base instanceof Bar) {
            bars.add((Bar) base);
        }
    }
于 2013-04-02T11:47:29.653 回答
-2

当您使用泛型 BASE 时..它会自动为您过滤 BASE 类..但是如果您想要根据上面示例中提到的 BASE 类的子类来指定..这是不可能的..

于 2013-04-02T09:32:48.323 回答