2
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
4

3 に答える 3

5

コンパイラが実行できないチェックがいくつかあり、警告が表示されます。このメソッドでこれらを回避する唯一の方法は、メソッドの前にアノテーションを追加することです。

@SuppressWarnings("unchecked")

ArrayListのようなコレクションでさえ、警告なしにコンパイルしないでください。

于 2011-04-01T08:11:30.987 に答える
1

「instanceof」を使用して型をチェックする必要があります。コンパイラはそのチェックを認識しており、その場合、最初の行で警告をスローしません。

2 行目は「new EnumMap<K, Object>(enumCls);」のように記述します。

于 2011-04-01T08:14:10.677 に答える
0

少なくとも、Class<? extends Enum<?>>警告なしで を取得する方法があります。

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

それでも、すでに述べたようにK、EnumMap の型パラメーターとして使用する方法はありません。したがって、(リスクを評価した後に)警告を抑制することはまったく問題ありません。

于 2011-04-01T08:43:06.503 に答える