用番石榴联合两个ImmutableEnumSets

时间:2015-11-20 07:01:33

标签: java guava immutability enumset

我想从番石榴结合两个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>

工会如何正确完成?

1 个答案:

答案 0 :(得分:7)

好吧,Sets.union会返回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));