Kapitel 8. Generische Klassen

Ähnliche Dokumente
Kapitel 8. Generische Klassen

II.4.5 Generische Datentypen - 1 -

Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen

Kapitel 5: Interfaces

Objektorientierte Programmierung mit C++ SS 2007

Polymorphismus 179. Function.h. #include <string>

Gebundene Typparameter

Java I Vorlesung Generics und Packages

Programmieren 1 09 Vererbung und Polymorphie

Generische Datenstrukturen

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

1 Abstrakte Klassen, finale Klassen und Interfaces

Java Einführung Abstrakte Klassen und Interfaces

Info B VL 11: Innere Klassen/Collections

Skript Informatik B. Grundlagen der Software-Entwicklung

Informatik II Übung 06. Benjamin Hepp 5 April 2017

8. Generics Grundlagen der Programmierung 1 (Java)

ListElement (E i n f o, ListElement<E> prev, ListElement<E> next ) {

12 Abstrakte Klassen, finale Klassen und Interfaces

Algorithmen und Datenstrukturen. Übersicht. Interfaces und Generics. InsertionSort für Punkte. InsertionSort für Punkte

Java Einführung Klassendefinitionen

Programmieren 2 16 Java Collections und Generizität

Vererbung. CoMa-Übung XI TU Berlin. CoMa-Übung XI (TU Berlin) Vererbung / 47

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

Einfache Liste: Ein Stapel (Stack) Ansatz. Schaubild. Vorlesung 1. Handout S. 2. Die einfachste Form einer Liste ist ein Stapel (stack).

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

Softwaretechnik WS 16/17. Übungsblatt 01

Objektorientierte Programmierung. Kapitel 12: Interfaces

Neuere Sprachelemente in Java

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

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

1 Polymorphie (Vielgestaltigkeit)

12) Generische Datenstrukturen

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

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Typumwandlungen bei Referenztypen

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

12) Generische Datenstrukturen

Einstieg in die Informatik mit Java

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Java für Bauingenieure

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Fortgeschrittene Programmierung

Interfaces und Generics

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Einstieg in die Informatik mit Java

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Objektorientierte Programmierung. Kapitel 14: Interfaces

Teil V. Generics und Kollektionen in Java

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

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

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

Präsentation Interfaces

Container/ Collection: Klasse die (Pointer auf ) andere Klassen oder Typen int,char,bool etc. aufnimmt.

Objektorientierte PL/SQL-Entwicklung Ein Erfahrungsbericht aus Sicht von JAVA-Entwicklern

Programmieren 2 Java Überblick

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

EINFÜHRUNG IN DIE PROGRAMMIERUNG

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

Programmiermethodik 1. Klausur

Javakurs für Anfänger

Einführung in die STL

Wiederholung aus SWE2

Programmieren I. Kapitel 8. Vererbung

Java Einführung Vererbung und Polymorphie. Kapitel 13

Programmiertechnik Vererbung & Polymorphismus für Fortgeschrittene

Prinzipien Objektorientierter Programmierung

Programmieren in Java

Dynamische Typinformation A01 OOP. Dynamische Typinformation

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

Programmieren in Java -Eingangstest-

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

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

Einstieg in die Informatik mit Java

Die Schnittstelle Comparable

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){...... //Instantiierung: C<Student> p; Student s; C<Banane> q; Banane b; p.f(s); // OK p.f(b); // Typfehler T ist Parameter der Klasse. Zur Verwendung muss T mit konkreter Klasse instantiiert werden 80

8. Generische Klassen In generischen Klassen ist Code im Rumpf unabhängig von der Instantiierung (Polymorphismus). Deshalb will man ihn auch nur einmal schreiben, denn Coderedundanz ist tödlich. Standardanwendung: Containerklassen (vgl C++ Standard Template Library) Bsp Stack: class Stack<T> { T[] elements; int index; void push(t x) { elements[index++] = x; ; T top() {...... //Instantiierung: Stack<Student> st1; Student s; Stack<Banane> st2; Banane b; Stack<Stack<Student>> st3; // Komponenten zusammenstecken! st1.push(s); //ok s = st1.top(); //ok st1.push(b); // Typfehler! st2.push(b); //ok s = st2.top(); // Typfehler! st3.push(st1); //ok st3.push(st2); // 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 : T YP T YP; 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.1. GENERISCHE KLASSEN IN JAVA 8. Generische Klassen 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.1. GENERISCHE KLASSEN IN JAVA 8. Generische Klassen 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<X>, Y extends Comparable<Y>> 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<X>, Y extends Number & Comparable<Y>> implements Comparable<NP2<X,Y>> {... // mehrere Typschranken 84

8.1. GENERISCHE KLASSEN IN JAVA 8. Generische Klassen 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.2. WILDCARDS 8. Generische Klassen 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<X>, Y extends Comparable<Y>> 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>); f(new Käfig<Amsel>); -- OK -- TYPFEHLER Käfig<Amsel> nicht Unterklasse von Käfig<Vogel>! Generell kann es keine Unterklassenbeziehung zwischen generischen Instanzen 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.2. WILDCARDS 8. Generische Klassen Bsp: class Käfig<? extends Vogel> {... f(new Käfig<Vogel>); f(new Käfig<Amsel>); -- OK -- OK! Unterklassenbeziehung Käfig<Amsel> zu Käfig<Vogel> funktioniert, da man in Kä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.3. GENERISCHE PROGRAMMIERUNG IN C++ 8. Generische Klassen 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