Come faccio a riscrivere il seguente metodo senza avvisi non controllati?

voti
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;
    }
}

Avvertenze

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
È pubblicato 01/04/2011 alle 07:05
fonte dall'utente
In altre lingue...                            


3 risposte

voti
5

Ci sono alcuni controlli il compilatore non può fare e che vi darà un avvertimento. L'unico modo per evitare questi in questo metodo è quello di aggiungere annotazioni prima del metodo

@SuppressWarnings("unchecked")

Anche le collezioni come ArrayList in modo da non compilare senza avvisi.

Risposto il 01/04/2011 a 07:11
fonte dall'utente

voti
1

Si dovrebbe usare "instanceof" per verificare il tipo, il compilatore è a conoscenza di tale controllo e non lanciare un avvertimento sulla prima riga se si fa questo.

La seconda linea dovrebbe essere scritto come "nuova EnumMap <K, Object> (enumCls);".

Risposto il 01/04/2011 a 07:14
fonte dall'utente

voti
0

Beh, v'è almeno un modo per ottenere il Class<? extends Enum<?>>senza preavviso:

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

Ancora, come si è già detto, non v'è alcun modo per utilizzare Kcome parametro tipo per EnumMap. Quindi sopprimendo l'avvertimento (dopo valutazione dei rischi) è perfettamente soddisfacente.

Risposto il 01/04/2011 a 07:43
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more