首页 > 解决方案 > java中的这种语法是什么`集.SetView`?

问题描述

这是我试图理解的一些代码

public static <E> Sets.SetView<E> difference(final Set<E> set1, final Set<?> set2) {
    Preconditions.checkNotNull(set1, "set1");
    Preconditions.checkNotNull(set2, "set2");
    final Predicate<Object> notInSet2 = Predicates.not(Predicates.in(set2));
    return new Sets.SetView<E>() {
        public Iterator<E> iterator() {
            return Iterators.filter(set1.iterator(), notInSet2);
        }

        public int size() {
            return Iterators.size(this.iterator());
        }

        public boolean isEmpty() {
            return set2.containsAll(set1);
        }

        public boolean contains(Object element) {
            return set1.contains(element) && !set2.contains(element);
        }
    };
}

我对函数返回的内容感到困惑,当我使用它时,函数似乎正在返回Sets.SetView<E>

例如

        Set<Integer> a = new HashSet<>();
        Set<Integer> b = new HashSet<>();
        a.add(1);
        Sets.difference(a, b); // is of type Sets.SetView<Long>

<E>前面的额外前缀是什么?

为什么实际返回值包含方法定义?

    return new Sets.SetView<E>() {
        public Iterator<E> iterator() {
            return Iterators.filter(set1.iterator(), notInSet2);
        }

        public int size() {
            return Iterators.size(this.iterator());
        }

        public boolean isEmpty() {
            return set2.containsAll(set1);
        }

        public boolean contains(Object element) {
            return set1.contains(element) && !set2.contains(element);
        }
    };

标签: java

解决方案


不要读为<E> Sets.SetView<E>. 该方法返回Sets.SetView<E>。前置<E>是静态方法的通用模板语法。


推荐阅读