Guava Sets.difference#isEmpty() 行为

Guava Sets.difference#isEmpty() behaviour

我不明白 Guava 的 Sets 的行为#isEmpty() 方法的不同之处:

  public static <E> SetView<E> difference(final Set<E> set1, final Set<?> set2) {
    checkNotNull(set1, "set1");
    checkNotNull(set2, "set2");

    final Predicate<Object> notInSet2 = Predicates.not(Predicates.in(set2));
    return new SetView<E>() {
      @Override public Iterator<E> iterator() {
        return Iterators.filter(set1.iterator(), notInSet2);
      }
      @Override public int size() {
        return Iterators.size(iterator());
      }
      @Override public boolean isEmpty() {
        return set2.containsAll(set1);
      }
      @Override public boolean contains(Object element) {
        return set1.contains(element) && !set2.contains(element);
      }
  };
}

更准确地说,我不明白如何将 set2.containsAll(set1); 用作 isEmpty() 的结果。

举个例子:

差值(C,D,E)肯定不会为空。 但是 Sets.difference(set1, set2).isEmpty() 将 return 为真,因为 (A,B,C,D,E).containsAll(A,B) 为真。

即使 javadoc 这么说,我也不明白其中的逻辑:

{@code set2} may also contain elements not present in {@code set1}; these are simply ignored

我是不是记错了?我可以填写一个问题吗?

(我使用的是 guava-18.0)

来自"public static Sets.SetView difference(Set set1, Set set2)"的番石榴文档:

The returned set contains all elements that are contained by set1 and not contained by set2

如您所见,您的 set1 none 满足这些条件,因此差异集为空。

请注意,差异方法对于参数是不可交换的,差异集不是您在调用 difference(set1, set2);

时所想的那样 (C, D, E)