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 nyMap<String, Serializable>
instans, der caster nøglerne og værdierne tilString
ogSerializable
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;
}