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
Wie heißt es so schön?
Beschreibe alle Begriffe an einem kurzen Beispiel:
- Generischer Typ
- Typparameter
- formalter Typparameter
- parametrisierter Typ
- Typargument
- Wildcard-Typ
- Bounded Wildcard
- upper bound, lower bound
- generische Methode
- unchecked Warnung
- erasure
- Type Type
- Wildcard capture
- multiple bound
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" );