如何在没有未经检查的警告的情况下重写以下方法?

时间:2011-04-01 08:05:33

标签: java generics warnings unchecked

private <K> Map<K, Object> createMap(final Class<K> keyClass) {
    final boolean isEnum = keyClass.isEnum();

    if(isEnum) {
                    // The following two lines throw warnings
        final Class<? extends Enum<?>> enumCls = (Class<? extends Enum<?>>)keyClass;
        final Map<K, Object> map = (Map<K, Object>)new EnumMap(enumCls);

        return map;
    }
    else{
        final Map<K, Object> map = new HashMap<K, Object>();
        return map;
    }
}

警告

found   : java.lang.Class<K>
required: java.lang.Class<? extends java.lang.Enum<?>>
        final Class<? extends Enum<?>> enumCls = (Class<? extends Enum<?>>)keyClass;
                                                                           ^
T.java:9: warning: [unchecked] unchecked call to EnumMap(java.lang.Class<K>) as a member of the raw type java.util.EnumMap
        final Map<K, Object> map = (Map<K, Object>)new EnumMap(enumCls);
                                                   ^
T.java:9: warning: [unchecked] unchecked cast                                   
found   : java.util.EnumMap                                                     
required: java.util.Map<K,java.lang.Object>                                     
        final Map<K, Object> map = (Map<K, Object>)new EnumMap(enumCls);
                                                   ^
3 warnings

3 个答案:

答案 0 :(得分:5)

编译器无法进行一些检查,它会给你一个警告。在此方法中避免这些的唯一方法是在方法

之前添加注释
@SuppressWarnings("unchecked")

即使是像ArrayList这样的集合也不会在没有警告的情况下进行编译。

答案 1 :(得分:1)

您应该使用“instanceof”来检查类型,编译器会知道该检查,如果您这样做,则不会在第一行发出警告。

第二行应该写成“new EnumMap&lt; K,Object&gt;(enumCls);”。

答案 2 :(得分:0)

嗯,至少有一种方法可以在没有警告的情况下获取Class<? extends Enum<?>>

if (keyClass.isEnum()) {
  Enum<?> e = (Enum<?>)keyClass.getEnumConstants()[0];
  Class<? extends Enum<?>> enumCls = e.getDeclaringClass();
  // snip
}

仍然如前所述,没有办法使用K作为EnumMap的类型参数。因此,抑制警告(在评估风险之后)完全没问题。