Generischer Typ
Generische Typen sind Typparameter.
In der Programmiersprache Ada werden sie zur Parametrisierung von Paketeneingesetzt.
Ab Version 1.5 ("Tiger", 2004 veröffentlicht) stehen Typparameter auch in der Programmiersprache Java zur Verfügung. Sie werden hier Generics genannt und dienen dazu, Klassen mit zu verwendenden Typen zu parametrisieren. Damit werden der Sprache Möglichkeiten ähnlich zu Templates in C++ eröffnet.
Beispiel in Java:
Ein Programm möchte eine ArrayList
verwenden, um eine Liste von JButton
s zu speichern.
Bisher war die ArrayList auf den Typ Object fixiert:
ArrayList al = new ArrayList(); al.add(new JButton("Button 1")); al.add(new JButton("Button 2")); al.add(new JButton("Button 3")); al.add(new JButton("Button 4")); al.add(new JButton("Button 5")); for (int i = 0; i < al.length; i++) { JButton button = (JButton)al.get(i); button.setBackground(Color.white); }
Man beachte die notwendige explizite Typumwandlung ("Cast") sowie die Typunsicherheit, die damit verbunden ist. Man könnte versehentlich ein Objekt in der ArrayList
speichern, das keine Instanz der Klasse JButton
ist. Die Information über den genauen Typ geht beim Einfügen in die Liste verloren, der Compiler kann also nicht verhindern, daß zur Laufzeit bei der expliziten Typumwandlung von JButton
eine ClassCastException
auftritt.
Mit generischen Typen geht in Java zukünftig:
ArrayList<JButton> al = new ArrayList<JButton>(); al.add(new JButton("Button 1")); al.add(new JButton("Button 2")); al.add(new JButton("Button 3")); al.add(new JButton("Button 4")); al.add(new JButton("Button 5")); for (int i = 0; i < al.length; i++) { al.get(i).setBackground(Color.white); }
Beim Auslesen ist nun keine explizite Typumwandlung mehr notwendig, beim Speichern ist es nur noch möglich, JButtons in der ArrayList
al abzulegen.
Interessant ist dann auch noch die Kombination von generischen Typen mit den verbesserten For-Schleifen. Obiges Beispiel lässt sich somit kurz fassen:
ArrayList<JButton> al = new ArrayList<JButton>(); al.add(new JButton("Button 1")); al.add(new JButton("Button 2")); al.add(new JButton("Button 3")); al.add(new JButton("Button 4")); al.add(new JButton("Button 5")); for (JButton b : al) { b.setBackground(Color.white); }