【问题标题】:Is EnumMap Typesafe? [duplicate]EnumMap 类型安全吗? [复制]
【发布时间】:2016-07-01 02:19:51
【问题描述】:

[我投票决定为社区重新开放这个。问题What are the reasons why Map.get(Object key) is not (fully) generic 确实指出了问题的根本原因。但对我来说,Stack Overflow 是关于回答问题、访问工作示例代码和支持 API 使用的特定实例——而不是关于创建唯一根本原因的规范。我找不到另一个帖子,可能是因为它的标题。创建枚举是为了提供命名常量的安全替代方案。这个问题破坏了这个好处——没有在 API 中提及,也没有编译器警告。为什么将安全级别降低到命名常量以下?对于枚举用户,这个问题很有用——它在谷歌上排名第一。]

这应该编译吗?确实如此,即使我是 从使用 EnumAlpha 类型初始化的 enumMap 获取不同类型 (EnumDelta) 的枚举成员。我认为作为泛型类型,EnumMap 将保证 EnumAlpha 的类型安全。

    import java.util.EnumMap;

    class Enum {

            static enum EnumAlpha { ALPHA, BETA; }
            static enum EnumDelta { DELTA, EPSILON; }



            static EnumMap<EnumAlpha, String> enumMap = null;

            public static void main (String[] args) {

                    enumMap = new EnumMap<EnumAlpha, String>(EnumAlpha.class);
                    String string = "foo";

                    enumMap.put(EnumAlpha.ALPHA, string);

                    //why does this line compile?
                    System.out.println(enumMap.get(EnumDelta.DELTA)); 


            }


    }

程序输出:

空

【问题讨论】:

  • @shmosel 是的,就是这样——你会认为他们会在 get() 的 API 描述中全部大写。看起来我可以使用 containsKey() 作为实际检查——如果我可以假设该成员应该出现在地图中。但是,我刚刚添加的断言没有被触发。
  • 您现在问的是一个单独的问题。而且您可能需要启用断言。
  • 它是完全类型安全的。它只是违背了您的期望。
  • @JohnMeyer 你缺少的是 EnumMap 实现了 Map。所以适用于 Map 的一切也适用于 EnumMap。 Map.get() 不能完全泛型,EnumMap 是一个 Map,所以 EnumMap.get() 不能完全泛型。
  • 你收到ClassCastException了吗?如果不是,那么它是类型安全的。

标签: java generics enum-map


【解决方案1】:

由于linked post 中的解释,对于 EnumMap.get(),答案是否。

通过添加以下行,我能够避免难以理解的空指针异常:

     assert enumMap.containsKey(EnumDelta.EPSILON);

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2011-01-09
    相关资源
    最近更新 更多