# Attribute einer HttpSession / unchecked cast



## Sergeant_Pepper (28. Jul 2009)

Hallo,

einem HttpSession-Objekt kann ich beliebige Attribute zuordnen.
Z.B.
	
	
	
	





```
List<String> warnungen=new LinkedList<String>();
session.setAttribut("warnungen", warnungen);
```

Späteres Auslesen des Attributs:
	
	
	
	





```
List<String> warnungen=(List<String>)session.getAttribute("warnungen");
```

Dabei erhalte ich die Warnung: "Type safety: Unchecked cast from Object to List<String>"

Wie kann ich das vermeiden, abgesehen von @SuppressWarnings("unchecked") ?


----------



## maki (28. Jul 2009)

> Wie kann ich das vermeiden, abgesehen von @SuppressWarnings("unchecked") ?


Gar nicht


----------



## Sergeant_Pepper (29. Jul 2009)

schade... hab' ich befürchtet.
Trotzdem "Danke"


----------



## SlaterB (29. Jul 2009)

falls es dir nur um den technischen Aufwand geht, hilft eine generische Hilfsmethode, entweder statisch oder in einer Subklasse/ Ersatzklasse für Session:

@SuppressWarnings("unchecked")
public static <T> T getAttribute(Session, String) {
return (T) session.getAttribute(string)
}


schon sind alle Aufrufe
List<String> warnungen= getAttribute(session, "warnungen");
warn-frei,

allerdings wird damit alles ganz schön unterhöhlt, zu ClassCastExceptions kann es immer noch kommen,
wenn man das SuppressWarnings im Code stehen hat, wird man wenigstens noch ein bisschen drauf aufmerksam gemacht,
übrigens ginge dann

@SuppressWarnings("unchecked")
List<String> warnungen=(List)session.getAttribute("warnungen");
statt
@SuppressWarnings("unchecked")
List<String> warnungen=(List<String>)session.getAttribute("warnungen");

man muss/ kann nie generisch casten


----------



## Sergeant_Pepper (29. Jul 2009)

SlaterB hat gesagt.:


> generische Hilfsmethode, entweder statisch oder in einer Subklasse/ Ersatzklasse für Session:


Ich habe die Methode 

```
@SuppressWarnings("unchecked")
private static <T> getAtt(HttpSession session, String att);
    {
        return (T) session.getAttribute(att);
    }
```
in meinen Servlet-Code eingebaut, das klappt. Dadurch wirkt SuppressWarnings nur auf einen kleinen Abschnitt.

Danke 



> allerdings wird damit alles ganz schön unterhöhlt, zu ClassCastExceptions kann es immer noch kommen,
> *wenn man das SuppressWarnings im Code stehen hat*, wird man wenigstens noch ein bisschen drauf aufmerksam gemacht



äh... wenn SuppressWarnings im Code steht, werde ich doch gerade nicht informiert?


----------



## SlaterB (29. Jul 2009)

beim Code lesen/ später verändern/ Fehler suchen bemerkt man das SuppressWarnings hoffentlich und zieht daraus seine Schlüsse,
mit der Hilfsmethode nicht mehr/ weniger, man muss schon separat die Information im Gedächtnis haben, dass getAtt() entsprechendes tut,

kein echtes Problem, nur der Vollständigkeit halber drauf hingewiesen, bevor jemand meckert


----------



## Sergeant_Pepper (29. Jul 2009)

ach so.
Vielen Dank.
Nun ist's wirklich erledigt.


----------



## wolfgke (29. Jul 2009)

Mein Vorschlag:


```
Object warnungen=session.getAttribute("warnungen");

if (warnungen instanceof List<String>) {
   return (List<String>) warnungen;
} else {
   return null; // Oder Exception werfen
}
```


----------



## SlaterB (29. Jul 2009)

wie gesagt: Casts und instanceof funktionieren nicht mit Generics, 
kann man sich im Code sparen und eine Warning vom Compiler eh nicht verhindern


----------

