Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
List l = new ListWithInt(1,2,3,4,5)
List l = new ListWithString("abc","def","ghi")
// gegenüber
List<Integer> l = new ObjectList<Integer>(1,2,3,4,5)
List<String> l = new ObjectList<String>("abc","def","ghi")
Die Generische Implementierung hat schlichtweg den Vorteil, dass du weniger konkrete Klassen erstellen und folglich weniger schreiben musst.
Der Compiler kann bei einer guten Implementierung praktisch immer für Typsicherheit sorgen. Weiterhin könnte der Compiler anhand der Typparameter einen konkreten Typ erzeugen (z.B. die Typen ListWithInt oder ListWithString).
Du kannst Code schreiben, der typsicher Datentypen verarbeiten kann, die du nicht kennst bzw. die noch gar nicht exisiteren.
Um Antoras' Beispiel zu erweitern: Ich kann jetzt eine neue Klasse namens [c]Schwurbel[/c] schreiben, und die generischen Java-Collections können damit umgehen. Obwohl sie Jahre vor meinem Code geschrieben wurden, gibt mir eine [c]List<Schwurbel>[/c] in der get-Methode ganz ordentlich und typsicher ein [c]Schwurbel[/c] zurück. So etwas kann nur mit einer Form von Typ-Polymorphismus (z.B. Generics, abstrakte Typ-Member...) funktionieren.
Ein weiteres, etwas exotisches Anwendungsgebiet ist Typ-Level-Programmierung: Church-Numerale, heterogene Listen, Phantom-Typen u.s.w. Eine praktische Anwendung ist z.B. das typsichere Builder-Pattern (eine Anwendung von Phantom-Typen): Type-safe Builder Pattern in Java Michid’s Weblog