Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. N. Rauch Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik Übungsblatt 11: Fortgeschrittene Aspekte objektorientierter Programmierung (SS 2007) Ausgabe: 2. Juli 2007 Abgabe: 9. Juli 2007 (in der Vorlesung) Aufgabe 1 Generics und Comparable Tische lassen sich einteilen in runde und eckige Tische. Interessante Größen für Tische sind zum Beispiel die Anzahl der Ecken, die Anzahl der Beine und die Größe der Tischfläche (in Quadratzentimetern). a) Modellieren Sie Tische wie oben skizziert und implementieren Sie sie auf zwei verschiedene Arten und Weisen. 1. In der ersten Modellierung soll es möglich sein, Tische beliebiger Form zu vergleichen. Hierbei ist die Tischfläche ein gutes Vergleichskriterium. 2. In der zweiten Modellierung sollen nur runde Tische mit runden Tischen verglichen werden können (nach der Anzahl der Tischbeine), sowie nur eckige Tische mit eckigen (nach der Anzahl der Ecken). b) Erstellen Sie zu jeder der beiden Implementierungen je drei Listen: Die erste Liste soll runde Tische enthalten, die zweite eckige Tische, und die dritte soll Tische unabhängig von ihrer Plattenform verwalten. Bestimmen Sie jeweils den maximalen Tisch (gemäß der o. g. Kriterien) der (jeweils) drei Listen. Aufgabe 2 Wildcards I Betrachten Sie die folgende Methodensignatur aus java.util.Collections. Erläutern Sie die Typparameter und warum sie sinnvoll sind. public static <T extends Comparable<? super T>> T max(Collection<? extends T> c) Aufgabe 3 Wildcards II Verallgemeinern Sie in dem folgenden Codestück alle Typparameter durch Verwendung von Wildcards, soweit dies möglich ist. package blatt11; import java.util.List; public class Aufgabe3<T> { private T value; public List<T> addValue(List<T> l) { l.add(value); return l; } public List<T> extractValue(List<T> l) { value = l.remove(0); return l; } public List<T> replaceValue(List<T> l) { l.add(value); value = l.remove(0); return l; } } Aufgabe 4 Generics und Typauslöschung Generics sind nur im statischen Programmcode vorhanden, nicht jedoch im Bytecode. Diese Aufgabe untersucht, inwieweit vom Compiler Veränderungen am generischen Code vorgenommen werden. Betrachten Sie hierzu den folgenden Code: public class StringList extends java.util.ArrayList<String> { private static final long serialVersionUID = 1L; @Override public boolean add(String s){ return super.add("String # " + (size()+1) + ": " + s ); } @Override public String get(int index) { return "At pos " + index + ": " + super.get(index); } } public class StringListLeer extends java.util.ArrayList<String> { /* leer */ } a) Wie sieht eine nicht-generische Variante der Klasse StringList aus? b) Untersuchen Sie mittels Reflection, welche Methoden tatsächlich in der generischen Klasse StringList vorhanden sind. c) Betrachten Sie die Klasse StringListLeer. Werden in diesem Fall Methoden vom Compiler hinzugefügt, und wenn ja, welche? Begründen Sie Ihre Antwort.