用番石榴联合两个ImmutableEnumSets

Jue*_*gen 2 java immutability enumset 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);
}
Run Code Online (Sandbox Code Playgroud)

该字段ourColorSet不编译,它失败了

Type mismatch: cannot convert from Sets.SetView<OurColors.Colors> to
ImmutableSet<OurColors.Colors>
Run Code Online (Sandbox Code Playgroud)

工会如何正确完成?

Jon*_*eet 7

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

public final static Sets.SetView<Colors> ourColorSet =
        Sets.union(myColorSet, yourColorSet);
Run Code Online (Sandbox Code Playgroud)

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

public final static Set<Colors> ourColorSet =
        Sets.union(myColorSet, yourColorSet);
Run Code Online (Sandbox Code Playgroud)

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

public final static ImmutableSet<Colors> ourColorSet =
        Sets.union(myColorSet, yourColorSet).immutableCopy();
Run Code Online (Sandbox Code Playgroud)

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

public final static ImmutableSet<Colors> ourColorSet =
        Sets.immutableEnumSet(Sets.union(myColorSet, yourColorSet));
Run Code Online (Sandbox Code Playgroud)