Kapitel 8. Generische Klassen

Ähnliche Dokumente
Kapitel 8. Generische Klassen

Einstieg in die Informatik mit Java

A(T1) A(T2) A(T1) A(T2)

Gebundene Typparameter

Java I Vorlesung Generics und Packages

Java Einführung Abstrakte Klassen und Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces

Generische Datenstrukturen

Objektorientierte Programmierung. Kapitel 12: Interfaces

8. Generics Grundlagen der Programmierung 1 (Java)

Skript Informatik B. Grundlagen der Software-Entwicklung

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

1 Polymorphie (Vielgestaltigkeit)

Softwaretechnik WS 16/17. Übungsblatt 01

12) Generische Datenstrukturen

Java Einführung Klassendefinitionen

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

12) Generische Datenstrukturen

Präsentation Interfaces

Typumwandlungen bei Referenztypen

Teil V. Generics und Kollektionen in Java

Generische Typen in Java 1.5. Die Erweiterung der Java Language Specification

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

9. Kapitel GENERICS. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Einstieg in die Informatik mit Java

Programmieren 2 Java Überblick

185.A Software-Entwurfsmuster 1 OOP. Software-Entwurfsmuster

Prinzipien Objektorientierter Programmierung

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Fortgeschrittene Programmierung

OOP. Tagesprogramm. Dynamische Typinformation. Homogene Übersetzung der Generizität. Generizität und Typumwandlungen

Programmieren I. Kapitel 8. Vererbung

Java I Vorlesung 6 Referenz-Datentypen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Factory Method (Virtual Constructor)

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Proseminar: C# und.net. 6. Vortag Generische Klassen. Sebastian Wolf

Th. Letschert OOP 2 1. Vererbung I : Subklasse und Subtyp

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Informatik II (D-ITET) Übungsstunde 6

Kapitel 6. Vererbung

Java I Vorlesung Vererbung und Sichtbarkeit

Prof. Dr. Uwe Schmidt. 21.August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (BInf 211, BTInf 211, BMInf 211, BWInf 211)

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Einführung in die STL

Javakurs für Anfänger

Probeklausur: Programmierung WS04/05

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

Arten des universellen Polymorphismus

kurze Wiederholung class templates

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Software-Entwurfsmuster

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Probeklausur: Programmierung WS04/05

Klausur: Java (Liste P)

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Type Erasure in Java 5. Helmi Jouini Institut für Theoretische Informatik Universität Karlsruhe

Algorithmen und Datenstrukturen 07

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

1. Abstrakte Klassen

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Programmierkurs C++ Abstrakte Klassen und Methoden

Javakurs für Anfänger

Java Vererbung. Inhalt

OO Softwareentwicklung

Theorie zu Übung 8 Implementierung in Java

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Einstieg in die Informatik mit Java

Objektorientierte Programmierung

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Höhere Programmierkonzepte Testklausur

Repetitorium Informatik (Java)

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Stack stack = new Stack(); stack.push ("Würstchen"); string s = (string) stack.pop(); Console.WriteLine (s);

Geschachtelte Klassen

Repetitorium Informatik (Java)

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Einstieg in die Informatik mit Java

Objektorientierung (OO)

Algorithmen und Programmierung II

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Kapitel 9. Inner Classes. 9.1 Wiederholung: Iteratoren. Ausführen einer Operation auf allen Elementen einer Containerklasse

13. Tutorium zu Programmieren

Transkript:

Kapitel 8 Generische Klassen Ziel: Zusammensetzen von Software-Bausteinen Oft probiert, nie erreicht! sprachliche Mittel fehlten In C++, ADA, Eiffel, Java: Klassen, die mit anderen Klassen parametrisiert sind: class C<T>{ // generische Klasse T x; void f(t y){...... C<Student> p; Student s; C<Hiwi> q; Hiwi h; p.f(s); // OK p.f(h); // Typfehler 81

8. Generische Klassen Eine generische Klasse kann man als Funktor ( Kategorientheorie) auffassen: sie bildet einen Typ (i.e. Klasse) in einen Typ ab. C : TYP TYP; T C T Eiffel/C++: Parameterklasse kann irgendwas sein generische Definition nicht isoliert typcheckbar, sondern nur konkrete Instanzen Bibliotheken nicht statisch typprüfbar Java et al: Bounded Polymorphism: Parameter muß Unterklasse einer gewissen Klasse sein Verfügbarkeit von Methoden kann auch in generischen Klassen statisch geprüft werden Klassen/Module höherer Ordnung ( Funktoren ) Wiederverwendung, Allgemeinheit, Bibliotheken, Komponentenretrieval werden enorm verbessert! 82

8. Generische Klassen 8.1. GENERISCHE KLASSEN IN JAVA 8.1 Generische Klassen in Java Bis Java 1.4. mussten generische Container und polymorphe Funktionen mittels Elementen vom Typ Object und Downcasts realisiert werden, was sehr fehleranfällig ist: class Stack { Object[] elements; void push(object x) {... ; Object top() {... Object id(object x) { return x; Point q = (Point) id (new Point()); // OK Point q = (Point) id (new Student()); // statisch korrekt, // aber illegaler Downcast zur Laufzeit Point q = (Point) top(push(new Student())); // dito in Java 1.5. bzw Java 5 : Typschranken für Typparameter generischer Klassen/Interfaces erlauben Typprüfung von isolierten Klassendefinitionen Objekte mit generischem Typ dürfen Methoden der Typschranke verwenden NB: keine Typschranke = Typschranke Object 83

8. Generische Klassen 8.1. GENERISCHE KLASSEN IN JAVA Beispiele: class NumberPair<X extends Number, Y extends Number> { // Typschranke=Klasse X a; Y b; public X first(numberpair<x,y> p){return p.a; NumberPair<Integer,Float> np = new NumberPair<Integer,Float> (); interface Comparable<T> { int compareto(t o) class Time implements Comparable<Time> { int compareto(time o) {... // Verwendung generischer Interfaces class Pair<X extends Comparable, Y extends Comparable> implements Comparable<Pair<X,Y>> { // Typschranke = generisches Interface X a; Y b; int compareto (Pair<X,Y> other) {... a.compareto(other.a)...... b.compareto(other.b);... class NP2 <X extends Number & Comparable, Y extends Number & Comparable> implements Comparable<NP2<X,Y>> {... // mehrere Typschranken 84

8. Generische Klassen 8.1. GENERISCHE KLASSEN IN JAVA generische Methoden: Typparameter steht vor Methodensignatur, zb static <U extends T> U foo(u x) {... class UT extends T {... T x = foo(new T()); // OK UT y = foo(new UT()); // OK Diese Flexibilität kriegt man auch durch Kontravarianz ( Typsysteme) nicht hin Implementierung generischer Klassen: da die JVM nicht geändert wurde, setzt der Compiler nach der Typprüfung für alle Typparameter Object ein und ersetzt generische Klassen durch ihren nichtgenerischen Rohtyp. Illegale Downcasts sind nun aber ausgeschlossen! Es gibt Refaktorisierungstools (zb von Frank Tip für Eclipse), die automatisch Programme ohne Generizität in Programme mit generischen Klassen umsetzen 85

8. Generische Klassen 8.2. WILDCARDS 8.2 Wildcards Kann man zwischen generischen Klassen oder Instanzen eine Vererbungsbeziehung definieren? Bsp: class OrderedList<Data> extends List<Data> {... // OK class OrderedPair<X extends Comparable, Y extends Comparable> extends Pair<X,Y> {... // OK class Amsel extends Vogel {... class Strauss extends Vogel {... class Käfig<Art extends Vogel> { Art insasse;... void f(käfig<vogel> k) {... f(new Käfig<Vogel>); -- OK f(new Käfig<Amsel>); -- TYPFEHLER Käfig<Amsel> nicht Unterklasse von Käfig<Vogel>! Generell kann es keine Unterklassenbeziehung zwischen generischen Klassen geben, wenn diese zuweisbare Unterkomponenten/Members des Typparameters enthalten (wie insasse) NB auch zwischen Arrays kann es eigentlich keine Unterklassenbeziehung geben, obwohl Java dies zulässt ( Array-Anomalie ) Begründung für beides im Kapitel Typsysteme Um diese Einschränkung zu umgehen, gibt es Wildcards de facto anonyme Typparameter 86

8. Generische Klassen 8.2. WILDCARDS Bsp: class Käfig<? extends Vogel> {... f(new Käfig<Vogel>); -- OK f(new Käfig<Amsel>); -- OK! Unterklassenbeziehung Käfig<Amsel> zu Käfig<Vogel> funktioniert, da man inkäfig kein zuweisbares Member vom Typ? deklarieren kann. Trotz dieser Einschränkung sind Wildcards nützlich! Beispiele: Collections.copy/binarySearch static <T> void copy(list<? super T> dst, List<? extends T> src ) static <T extends Comparable<? super T>> int binarysearch(list<? extends T> lst, T k) ) Achtung: mehrere? stehen für verschiedene anonyme Parametertypen? super T gibt eine untere Typschranke an Diese Formulierungen sind flexibler als static<t extends Comparable<T>> int binarysearch(list< T> lst, T K) static <U> void copy(list<? super U> dst, List<U> src) da man nicht zb in einer Liste von Studenten nach einer Person suchen kann. Dies geht hingegen in der obe- 87

8. Generische Klassen 8.3. GENERISCHE PROGRAMMIERUNG IN C++ ren Formulierung (wenn Person Comparable implementiert). Es ginge sogar, wenn nur Lebewesen Comparable implementiert. Beim Kopieren kann die obere Formulierung eine Liste von Studenten (elementweise) in eine Liste von Lebewesen kopieren, die untere kann nur eine Liste von Personen in eine Liste von Lebewesen kopieren; ohne super müssten beide Listen exakt den gleichen Typ haben 8.3 Generische Programmierung in C++ weiteres Beispiel: MVC in C++ mit Templates und Function Pointern Kapitel 10.4 88