Java: ArrayList is a raw type...

bitmuncher

Senior-Nerd
Ich arbeite mich gerade etwas tiefer in Java ein. Dabei nutze ich das erste Mal Eclipse anstatt Emacs und dieser zeigt mir in einem funktionierenden Code immer Warnungen an, bei denen ich 1. keine Ahnung habe, was sie mir sagen wollen und 2. sie deswegen auch nicht beheben kann. Die Warnungen sind alle in folgender Art:

Code:
ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized...

Die zugehörige Code-Zeile sieht so aus (hier nur ein Beispiel):

Code:
ArrayList oList=(ArrayList) client.getProperties().getProperty("StreamList");

Nun stellt sich mir natürlich die Frage, wie man Referenzen in Java parametisieren kann. Hat mal jemand einen passenden Ausschnitt aus einer Referenz parat oder kann mir erklären was diese Warnung soll? Der Code funktioniert ansich problemlos und der Compiler wirft beim Erstellen des Projekts auch keine Fehler aus.

Sofern es wichtig ist. 'client' ist vom Typ 'IClient' aus der Wowza-Mediaserver-Library. Rückgabe-Typ von getProperties() ist 'WMSProperties' und getProperty gibt ein 'Object' zurück. Die API-Doku für IClient findet man unter http://accesscafegroup.com/WowzaMed...n/serverapi/com/wowza/wms/client/IClient.html
 
Das Stichwort hier ist "Generics". ArrayList bzw java.util.List ist seit Java 1.5 generic. Dh du musst von vornherein den Typ von Listenelementen angeben, die erlaubt sind. Ansonsten könnte in ein und derselben Liste ein Integer, ein String und eine weitere Liste sein, verstehst du? Um das anzugeben musst du die Liste "parameterisieren" und zwar dort wo das "E" steht:

Code:
List<String> listOfStrings = new ArrayList<String>();

Möchtest du trotzdem alle möglichen Typen als Elemente erlauben musst du statt String Object verwenden:

Code:
List<Object> listOfAnything = new ArrayList<Object>();

Alles klar?
 
Arbeite mich auch gerade in Java ein, allerdings nutze ich lieber Netbeans (ist aber an sich relativ egal).
Dabei bin ich auch auf Generics als Lösung bei einem Problem gekommen. Sehr schöne Sache das Ganze. Man braucht ArrayListen nicht mehr zu casten, man kann Methoden erstellen, bei denen der Objekttyp des Rückgabewertes oder der Objekttyp des Parameters erst zur Laufzeit bekannt ist.

@bitmuncher:
Dafür, dass Du dich da gerade einarbeitest, sieht das aber schon ganz gut aus. Woran arbeitest Du gerade genau, wenn ich fragen darf?
 
Wenn ich jetzt aber das obige Beispiel so abändere, dass es parametisiert ist

Code:
ArrayList<Object> oList = (ArrayList<Object>) client.getProperties().getProperty("StreamList");

habe ich ein "unchecked" Typecasting. Stellt sich mir natürlich die Frage, wie ich das dann wegbekommen soll. Ohne Typecasting geht es natürlich auch nicht. Btw. ist es überhaupt möglich ein Object einfach in ein ArrayList<Object> zu casten, oder muss ich auf eine Member-Funktion von ArrayList zurückgreifen um das Object in die ArrayList zu "kopieren" und wenn ja welche?

Naja, ich werde mir diese Generics mal genauer anschauen. Hab ich ja schonmal ein Stichwort, womit ich die Suchmaschinen füttern kann. :)

@GambaJo: Es geht um eine Videostreaming-Applikation, bei der die Ressourcen/Videos auf mehrere Server (und Clients) verteilt sind. Java bietet sich für sowas ja geradezu an, vor allem in Verbindung mit Wowza.

Edit: Ok, hab die Lösung für das obige Beispiel gefunden. Korrekt muss es so aussehen:

Code:
ArrayList<Object> oList = new ArrayList<Object>();
oList.add(client.getProperties().getProperty("StreamList"));

Nun muss ich nur noch testen, ob das irgendwelche Seiteneffekte haben kann. ;)
 
Ich kann mich gerade nicht mehr an das Beispiel erinnern aber irgendwo hatte ich das Problem auch schonmal, dass ich irgendwoher eine "raw List" bekomme und mich ja eigentlich an 1.5 Standards halten will... Ist ja im Endeffekt nur ein Warning und kein Error aber wenn du das Warning wegbekommen willst kannst du eine Annotation verwenden:

Code:
@SuppressWarnings("unchecked")
public void foo() {
       List<Object> list = bar.getRawList();
}
 
Suppress Warnings wollte ich eigentlich vermeiden. Momentan sieht es so aus, als würde die obige Lösung funktionieren. Sie wirft keine Warnungen mehr aus und macht, was ich erwartet habe. Danke für die Hilfe und die Denkanstöße. :)
 
Zurück
Oben