Как переписать следующий метод без непроверенных предупреждений? - PullRequest
2 голосов
/ 01 апреля 2011
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 ]

5 голосов
/ 01 апреля 2011

Есть некоторые проверки, которые не может выполнить компилятор, и он выдаст вам предупреждение.Единственный способ избежать этого в этом методе - добавить аннотацию перед методом

@SuppressWarnings("unchecked")

Даже такие коллекции, как ArrayList, поэтому не компилируются без предупреждений.

1 голос
/ 01 апреля 2011

Вы должны использовать «instanceof» для проверки типа, компилятор знает об этой проверке и не выдаст предупреждение в первой строке, если вы сделаете это.

Вторая строка должна быть написана как "new EnumMap (enumCls);".

0 голосов
/ 01 апреля 2011

Ну, есть хотя бы способ получить Class<? extends Enum<?>> без предупреждения:

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

Тем не менее, как уже было сказано, нет способа использовать K в качестве параметра типа для EnumMap. Следовательно, подавление предупреждения (после оценки рисков) совершенно нормально.

...