Java >> Java tutorial >  >> Java

Hvordan løser man denne sikkerhedsadvarsel af Java-type?

Jeg tror ikke, der er nogen anden måde end @SuppressWarnings("ikke markeret"). Jeg tror, ​​du kan sætte det lige over den pågældende linje, og det vil kun undertrykke den linje.

Rediger:du kan også gøre Map<?, ?> session = ActionContext.getContext().getSession(); men jeg er ikke sikker på, hvor villig du er til at gøre det; du vil ikke være i stand til at sætte noget ind i kortet på den måde (da compileren ikke kan kontrollere typen af ​​det, du lægger), skal du kun læse fra det.


Den sikreste og mest effektive måde at håndtere dette på er sandsynligvis:

Map<?, ?> session = ActionContext.getContext().getSession();

og skriv derefter cast objekterne hentet fra sessionskortet.

@SuppressWarnings-tilgangen vil faktisk resultere i kompileret kode, der er identisk. Dog vil typestøbningen være implicit; dvs. det vil ikke være nemt at få øje på ved at se på kildekoden. Og @SuppressWarnings-annotationen kunne (hypotetisk) undertrykke nogle andre advarsel i den samme kodeblok, der repræsenterer en reel fejl; dvs. en, der vil resultere i, at en af ​​de skjulte typecasts osv. fejler under kørsel.

Andre dyrere alternativer omfatter:

  • en post for post kopi fra Map<?, ?> til en ny Map<String, Serializable> instans, der caster nøglerne og værdierne til String og Serializable henholdsvis eller

  • en generisk metode som den følgende, der udfører typecast sikkert.

@SuppressWarnings("unchecked")
public <K,V> Map<K,V> castMap(Map<?, ?> map, Class<K> kClass, Class<V> vClass) {
    for (Map.Entry<?, ?> entry : map.entrySet()) {
        kClass.cast(entry.getKey());
        vClass.cast(entry.getValue());
    }
    return (Map<K,V>) map;
}

Java tag