Generics

Nutzen von Generischen Typen

String-Liste aufbauen und ablaufen

Erzeuge eine ArrayList, die nur String-Objekte aufnehmen kann. Fülle sie mit ein paar Strings.

Laufe sie mit dem erweiterten for ab.

Typisierungen der Box

Setzte eine neue class Pair<A,B> { A first; B second; } in das Projekt.

Welche Compilermeldung bekommen wir, wenn wir im Code-Block Pair p = new Pair(); schreiben? Parametrisiere das Paar so, dass es Double und String aufnimmt.

Belege und erfrage first/second von p und erkenne auch die Anwendung des Auto-Boxings.

Methoden-Typisierung statt Klassentypisierung

Warum findet man bei der Klasse ArrayList in der Methode T[] toArray(T[] a) nicht den Typ E, sondern T?

Häufigkeiten zählen (15 Minuten)

Für Wörter aus einer Liste sollen deren Häufigkeiten festgehalten werden. Dazu definieren wir eine Klasse WordCounter mit einer Methode update(String) und clear(). Eine Methode getWordCount(String) soll dann zurückgeben, wie oft das Wort bisher vorkam.

public class WordCounter {
 public void update( String s ) { }
 public void clear() { }
 int getWordCount( String s ) { return 0; }
}

Zum Testen schreibe:

WordCounter wc = new WordCounter();
wc.update( "Hallo" );
wc.update( "Welt" );
wc.update( "Hallo" );
System.out.println( wc.getWordCount("Hallo") );  // 2
System.out.println( wc.getWordCount("Welt") );   // 1
System.out.println( wc.getWordCount("NIX") );    // 0

Lösung

Wie heißt es so schön?

Beschreibe alle Begriffe an einem kurzen Beispiel:

Fragen zu Typeinschränkungen (20 Minuten)

Um java.awt.Point-Objekte in ein HashSet einsortieren zu können, müssen wir einen externen Comparator definieren, da Punkte-Objekte nicht Comparable sind. Schreibe einen mit Point generisch deklarierten Comparator, der den Abstand zum Nullpunkt (euklidisch oder in der Manhatten-Metrik) als Kriterium verwendet.

Set<Point> set = new TreeSet<Point>( comparator );
set.add( new Point(2,3) );
set.add( new Point(9,9) );
set.add( new Point(3,2) );
set.add( new Point(1,1) );
System.out.println( set );

Die Sortierreihenfolge bei der Ausgabe soll etwa sein: (1,1), (2,3); (9,9).

Was kann man mit <?> machen?

Wird es bei folgenden Zeilen einen Compiler-Fehler geben? Wie erklärt sich das Verhalten?

Collection<?> list = new ArrayList<String>();
list.add( "Hallo Welt" );