Übungsblatt 11: Fortgeschrittene Aspekte objektorientierter

Werbung
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.
Herunterladen