将两个 ImmutableEnumSet 与 Guava 合并

Union two ImmutableEnumSets with Guava

我想从 Guava 合并两个 ImmutableEnumSets。 这是我的尝试:

public final class OurColors {

    public enum Colors {
        RED,
        GREEN,
        BLUE,
        YELLOW,
        PINK,
        BLACK
    }

    public final static ImmutableSet<Colors> myColorSet =
            Sets.immutableEnumSet(Colors.BLUE,
                                  Colors.GREEN);

    public final static ImmutableSet<Colors> yourColorSet =
            Sets.immutableEnumSet(Colors.YELLOW,
                                  Colors.PINK);

    public final static ImmutableSet<Colors> ourColorSet =
            Sets.union(myColorSet, ourColorSet);
}

字段 ourColorSet 未编译,失败

Type mismatch: cannot convert from Sets.SetView<OurColors.Colors> to
ImmutableSet<OurColors.Colors>

union是如何正确完成的?

好吧,Sets.union returns 一个 Sets.SetView<E>,而不是一个 ImmutableSet<E>。所以你可以这样做:

public final static Sets.SetView<Colors> ourColorSet =
        Sets.union(myColorSet, yourColorSet);

... 在许多情况下会很好,或者使用 Set 代替:

public final static Set<Colors> ourColorSet =
        Sets.union(myColorSet, yourColorSet);

这仍然是不可修改的,它只是没有 ImmutableSet<E> 这样的编译时类型。如果你真的非常需要,你可以使用 immutableCopy():

public final static ImmutableSet<Colors> ourColorSet =
        Sets.union(myColorSet, yourColorSet).immutableCopy();

... 或创建另一个枚举感知集:

public final static ImmutableSet<Colors> ourColorSet =
        Sets.immutableEnumSet(Sets.union(myColorSet, yourColorSet));