【问题标题】:Union two ImmutableEnumSets with Guava将两个不可变 EnumSet 与 Guava 联合
【发布时间】:2016-02-22 14:12:40
【问题描述】:

我想合并来自 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>

联合是如何正确完成的?

【问题讨论】:

    标签: java guava immutability enumset


    【解决方案1】:

    好吧,Sets.union 返回的是 Sets.SetView&lt;E&gt;,而不是 ImmutableSet&lt;E&gt;。所以你可以这样做:

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

    ...在很多情况下都可以,或者改用Set

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

    这仍然是不可修改的,它只是没有ImmutableSet&lt;E&gt; 的编译时类型。如果您真的非常需要,可以使用immutableCopy()

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

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

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

    【讨论】:

    • 谢谢。我需要 EnumSets 的性能和不变性。所以我需要你的第二个建议。
    • @juxeii:请注意,您没有EnumSet - 只有ImmutableSet。如果您需要EnumSet,您将需要一种不同的方法 - 我正在编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 2019-01-02
    • 2017-03-10
    • 1970-01-01
    • 2011-08-02
    • 2021-09-28
    • 2016-05-09
    • 2018-08-23
    相关资源
    最近更新 更多