Generisches Programmieren



Ähnliche Dokumente
Generisches Programmieren. Generisches Programmieren

Javakurs zu Informatik I. Henning Heitkötter

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Einführung in die Programmierung

Kundeninformationen zu Secure Mail

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Vier-Felder-Tafel. Medizinische Tests sind grundsätzlich mit zwei Fehlern behaftet: 1. Erkrankte werden als gesund, 2. Gesunde als krank eingestuft.

Einfacher loop-shaping Entwurf

Einführung in die Java- Programmierung

Große Übung Praktische Informatik 1

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Programmieren in Java

Anleitung. zur. Konfiguration. des. WLAN Repeaters

Objektorientierte Programmierung. Kapitel 12: Interfaces

Testen mit JUnit. Motivation

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

Java: Vererbung. Teil 3: super()

Mechanik 2. Addition von Geschwindigkeiten 1

Starten Sie Eclipse: Hier tragen sie Ihr Arbeitsverzeichnis ein. Zu Hause z.b. c:\workspace.

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Anleitung für die Online-Bewerbung über LSF auf Lehrveranstaltungen aller Lehramtsstudiengänge

Objektorientierte Programmierung

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Zählen von Objekten einer bestimmten Klasse

Objektorientierte Programmierung

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Enigmail Konfiguration

Statistische Analyse von Messergebnissen

Funktionale Programmierung mit Haskell

Typumwandlungen bei Referenztypen

Resultate GfS-Umfrage November Wie bekannt ist das Phänomen Illettrismus bei der Schweizer Bevölkerung?

Der lokale und verteilte Fall

Media Teil III. Begriffe, Definitionen, Übungen

Informationen zum Ambulant Betreuten Wohnen in leichter Sprache

Gebundene Typparameter

Themen. Web Service - Clients. Kommunikation zw. Web Services

Mobile Internet-Nutzung Befragungswelle zum Nutzungsverhalten von Mobile-Internet-Usern in Deutschland

Computeranwendung und Programmierung (CuP)

Brustkrebs. Genetische Ursachen, erhöhte Risiken. Informationen über familiär bedingten Brust- & Eierstockkrebs

1 Vom Problem zum Programm

Installation von Druckern auf dem ZOVAS-Notebook. 1. Der Drucker ist direkt mit dem Notebook verbunden

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

COPPPS Software und Services seit 1972 Software und Services aus einer Hand

1 Mathematische Grundlagen

Bei der Anlage von Pauschalen ist folgendes zu beachten!!!!!!!!

Rundung und Casting von Zahlen

Java Kurs für Anfänger Einheit 5 Methoden

Plotten von Linien ( nach Jack Bresenham, 1962 )

Datenbanken Kapitel 2

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

IT-SICHERHEIT IM UNTERNEHMEN Mehr Sicherheit für Ihre Entscheidung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

teamsync Kurzanleitung

FH-SY Chapter Version 3 - FH-SY.NET - FAQ -

Innere Klassen in Java

Aufklappelemente anlegen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

7 Rechnen mit Polynomen

Programmierkurs Java

Bevor lineare Gleichungen gelöst werden, ein paar wichtige Begriffe, die im Zusammenhang von linearen Gleichungen oft auftauchen.

Lineare Funktionen. 1 Proportionale Funktionen Definition Eigenschaften Steigungsdreieck 3

OECD Programme for International Student Assessment PISA Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

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

7. Übung zu Algorithmen und Datenstrukturen

affilinet_ Flash-Spezifikationen

Anleitung über den Umgang mit Schildern

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Einführung in die Programmierung

Wurzeln als Potenzen mit gebrochenen Exponenten. Vorkurs, Mathematik

Browsereinstellungen für moneycheck24 in Explorer unter Windows

FAMILIENSTAND ALLEINERZIEHENDE MÜTTER

Einführung in Javadoc

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Factory Method (Virtual Constructor)

Hilfedatei der Oden$-Börse Stand Juni 2014

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

I Serverkalender in Thunderbird einrichten

Gezielt über Folien hinweg springen

Prinzipien Objektorientierter Programmierung

Der Gabelstapler: Wie? Was? Wer? Wo?

Software Engineering Klassendiagramme Assoziationen

DOWNLOAD. Wortfeld Recht. Fachausdrücke des Alltags verstehen und anwenden. Jens Eggert. Downloadauszug aus dem Originaltitel:

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Programmieren I. Kapitel 15. Ein und Ausgabe

Abwesenheitsnotiz im Exchange Server 2010

Professionelle Seminare im Bereich MS-Office

Statuten in leichter Sprache

Sage Start Version 2011

FAQs für beglaubigte Übersetzungen Francesca Tinnirello

Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.)

Graphic Coding. Klausur. 9. Februar Kurs A

Können Hunde lächeln?

Die Größe von Flächen vergleichen

e LEARNING Kurz-Anleitung zum Erstellen eines Wikis 1. Wiki erstellen

Menü auf zwei Module verteilt (Joomla 3.4.0)

nic.at - Salzamt im (österreichischen) Internet?

Transkript:

Generiche Programmieren homa Röfer Generiche Klaen und Interface Generiche ypen ypebound Wildcard-ypen Überetzung genericher Klaen Grenzen genericher ypen Polymorphe Methoden

Rückblick Vererbung Pakete java.lang.sytem.out.println("hallo") Paket Paket Klae ttribut Methode Vererbung Mehrfache Erben Speicherlayout uper fn1 fn2 fn3 Frühe/päte Binden btrakte Klaen / Schnitttellen uper fn1() fn1() fn1 fn2() fn2() fn2 B B extend extend fn2() fn2() fn3() fn3() : : a a (); (); a.fn1(); a.fn1(); b b B(); B(); b.fn1(); b.fn1(); b.fn2(); b.fn2(); b.fn3(); b.fn3(); // // Kompilierfehler! Kompilierfehler! abtract Geraet abtract Geraet int eriennummer; abtract int eriennummer; ein(); abtract ein(); interface Printable interface Printable print(); print(); PI-1: Generiche Programmieren 2

Motivation ; ; ( ( info info ( ( info info r; r; ; ; ; ; etinfo( etinfo( info info Problem: Zugriff nicht yp-icher! 1 2 3 4 5 6 n1 n1 ("foo"); ("foo"); n2 n2 (3.14); (3.14); n0 n0 (23, (23, n1, n1, n2); n2); () () n1.; n1.; PI-1: Generiche Programmieren 3

Generiche Klaen Definition Generiche Klaen haben ypvariablen, die im Klaenrumpf verwendet werden können <> ypvariablen können (fat) wie ein normaler yp benutzt werden Mehrere ypvariablen ind möglich <> <> <> <> ; ; Pair<, Pair<, U> U> firt; firt; U U econd; econd; Pair( Pair( t, t, U U u) u) firt firt t; t; econd econd u; u; getfirt() getfirt() firt; firt; U U getsecond() getsecond() econd; econd; ( ( info info ( ( <> <> <> <> info info r; r; <> <> ; ; <> <> ; ; etinfo( etinfo( info info PI-1: Generiche Programmieren 4

Generiche ypen Generiche Interface Begriffe interface interface aggable<> aggable<> etag( etag( tag); tag); getag(); getag(); Eine generiche Klae it eine Klaendefinition, in der unbekannte ypen durch ypvariablen vertreten ind. Für generiche Interface gilt entprechende <> info Ein genericher yp it eine ypangabe, in der eine generiche Klae mit einem konkreten ypargument verehen wird <Integer> n <Integer>(23); implement implement aggable<> aggable<> tag; tag; public public etag( etag( t) t) tag tag t; t; public public getag() getag() tag; tag; Pair<Integer, > p Pair<Integer, >(28359, "Bremen"); PI-1: Generiche Programmieren 5

ypebound Motivation Manchmal ollen nicht alle ypen für die Belegung der ypvariablen zuläig ein, z.b. wenn e pezielle nforderungen an die ypargumente gibt Diee können durch ypebound fetgelegt werden < extend Number> Definition Ein ypebound bedeutet it kompatibel zu ypebound können Klaen und auch Interface ein uch bei Interface wird hier extend verwendet E kann mehrere ypebound pro ypvariable geben Sie werden durch & aufgezählt werden, z.b. < extend & B & C> Erter ypebound kann Klae oder Interface ein, weitere können nur Interface ein Ein ypebound legt die Mindetanforderungen für eine ypvariable fet Dadurch wird auch definiert, wa man von dieem yp an Funktionalität erwarten kann ypebound können wiederum die ypvariable enthalten < extend Comparable<>> PI-1: Generiche Programmieren 6

Wildcard-ypen Fragetellung Jede generiche Klae erzeugt viele generiche ypen <> erzeugt <Number>, <Integer>, <Double> Wie tehen die von einer generichen Klae erzeugten ypen zueinander? Vererbung genericher ypen Eine bleitungbeziehung zwichen ypargumenten überträgt ich nicht auf die generichen ypen <Number> n <Integer>(23); // Fehler! int int count(<?> count(<?> n) n) Die wird al Invarianz bezeichnet if(n if(n null) null) Generiche ypen können unbetimmte 0; 0; ele ypargumente nennen ele <?> nx; 1 1 + nx <>("foo"); + count(n.) count(n.) + nx <Integer>(1); + count(n.); count(n.); nx <Double>(3.14); Wildcard (Joke bei ypangaben PI-1: Generiche Programmieren 7

Covarianz genericher ypen Motivation Zu einem Wildcard-yp mit ypargument? ind alle generichen ypen der betreffenden generichen Klae kompatibel Manchmal möchte man die durch einen og. Upper-ypebound einchränken <? extend Number> nb; nb <Integer>(23); nb <>( ()); // Fehler! Definition Mit Upper-ypebound wird Covarianz für generiche ypen eröffnet llgemein gilt C<> it kompatibel zu C<? extend B>, wenn it kompatibel zu B Problem uch rray kennen Covarianz, aber tatiche ypprüfung veragt Number[ ] a Integer[23]; a[0] Double(3.14); // rraystoreexception Löung bei generichen ypen: nur Leen erlaubt <? extend Number> nb <Integer>(23); Number n nb.; nb.etinfo(3.14); // Fehler! PI-1: Generiche Programmieren 8

Contravarianz genericher ypen Motivation Zu einem Wildcard-yp mit ypargument? ind alle generichen ypen der betreffenden generichen Klae kompatibel Manchmal möchte man die durch einen og. Lower-ypebound einchränken <? uper Number> nb; nb <>( ()); nb <Integer>(23); // Fehler! Definition Mit Lower-ypebound wird Contavarianz für generiche ypen eröffnet llgemein gilt C<> it kompatibel zu C<? uper B>, wenn B it kompatibel zu Nur Schreibzugriff <? uper Number> nb <>( ()); nb.etinfo(1); Number n nb.; // Fehler! PI-1: Generiche Programmieren 9

Zuammenfaung Varianzen Invarianz Verchiedene generiche ypen ind zueinander inkompatibe unabhängig von der Kompatibilität ihrer ypargumente Bivarianz Wildcard-ypen ohne Einchränkung (C<?>) ind immer zueinander kompatibel Covarianz Zu Wildcard-ypen mit Upper-ypebound (C<? extend B>) ind alle generichen ypen kompatibe deren ypargument zu B kompatibel it Contravarianz Zu Wildcard-ypen mit Lower-ypebound (C<? uper B>) ind alle generichen ypen kompatibe zu deren ypargument B kompatibel it yp Leen Schreib. Kompatible ypargumente Invarianz C<> ja ja Bivarianz C<?> nein nein lle Covarianz C<? extend B> ja nein B und abgeleitete ypen Contravarianz C<? uper B> nein ja B und Baitypen PI-1: Generiche Programmieren 10

Überetzung genericher Klaen natz Generiche Datentypen werden in Java auchließlich vom Compiler verarbeitet Da Laufzeitytem weiß nicht von generichen Datentypen Überetzung Mit ype-eraure wird genericher Code mit ypvariablen und ypargumenten auf normalen, nicht-generichen Java-Quelltext reduziert Der nicht-generiche Java-Quelltext wird weiterverarbeitet wie biher u jeder generichen Klae wird eine nicht-generiche Klae generiert und in eine.-datei überetzt In C++ wird dagegen jede Intanziierung einer Klae mit ypargumenten getrennt überetzt Dadurch langamere Überetzen und größere Kompilate, aber beere Optimierungmöglichkeiten und weniger Einchränkungen PI-1: Generiche Programmieren 11

ype-eraure Bei der ype-eraure genericher Klaen werden yp-variablen in pitzen Klammern gelöcht Vorkommen von ypvariablen mit einem oder mehreren ypebound durch den einzigen bzw. erten ypebound eretzt Vorkommen von ypvariablen ohne ypebound durch eretzt Bei der ype-eraure der Verwendung genericher Klaen werden die yp-korrektheit tatich geprüft (d.h. zum Überetzungzeitpunkt) ypargumente müen allen ypebound genügen generiche ypen müen auch untereinander korrekt verwendet werden, inbeondere bei Wildcard-ypen ypargumente, einchließlich Wildcard, in pitzen Klammern gelöcht ypecat eingechoben, wo der Wert eine ypargument benutzt wird PI-1: Generiche Programmieren 12

ype-eraure Beipiel <> <> <> <> ; ; Generiche Klae ( ( info info ( ( <> <> <> <> info info r; r; <> <> ; ; <> <> ; ; etinfo( etinfo( info info <> <> n n <>("foo"); <>("foo"); n.; n.; ; ; Nach ype-eraure (Rawtype) ( ( info info ( ( info info r; r; ; ; ; ; etinfo( etinfo( info info n n ("foo"); ("foo"); () () n.; n.; PI-1: Generiche Programmieren 13

ype-eraure Beipiel <> <> <> <> ; ; Generiche Klae ( ( info info ( ( <> <> <> <> info info r; r; <> Rawtype <> laen ich auch ; ; <> direkt <> benutzen, aber die ; ; ypicherheit etinfo( etinfo( geht info verloren info (Compiler-Warnung) <> <> n n <>("foo"); <>("foo"); n.; n.; ; ; Nach ype-eraure (Rawtype) ( ( info info ( ( info info r; r; ; ; ; ; etinfo( etinfo( info info n n ("foo"); ("foo"); () () n.; n.; PI-1: Generiche Programmieren 14

Grenzen genericher ypen (1) Primitive ypargumente <int> ni <int>(23); // Fehler! ber: <Integer> ni <Integer>(23); // utoboxing Statiche Elemente Broken<> tatic data; // Fehler! Grund: lle Klaen Broken<> teilen ich da Klaenattribut data. Welchen yp oll e haben? Dynamiche ypprüfung <> boolean icompatible( o) o intanceof ; // Fehler! ype-eraure: o intanceof o intanceof ypecat <> etinfo( o) info () o; // Sinnlo ype-eraure: () o () o Compiler erzeugt: warning: unchecked cat of type PI-1: Generiche Programmieren 15

Grenzen genericher ypen (2) Kontruktoraufrufe <> () info (); // Fehler Woher oll Java wien, da einen Standard-Kontruktor hat? Beipiel: <Integer> ni <Integer>(); uweg: <> ( info <Integer> ni <Integer>(23); Generiche Baitypen import java.util.date; imetamped<> extend Date timetamp Date(); // Fehler Generiche Klae mu Kontruktor der Baiklae aufrufen können. Dieer kann hier aber nicht zur Kompilierzeit ermittelt werden! Exception UniveralException<> extend Exception reaon; // Fehler Generiche ypen können nicht für Exception verwendet werden, da da Fangen mit catch auf dem Ermitteln de yp de geworfenen Objekt baiert. Dieer geht aber bei der ype-eraure verloren. Compiler erzeugt: a generic may not extend java.lang.hrowable PI-1: Generiche Programmieren 16

Grenzen genericher ypen (3) rray von ypvariablen Container<> [] a [100]; uweg: Container<> [] a ([]) [100]; // Warnung Compiler erzeugt ue unchecked or unafe operation Man kann trotzdem typichere Klaen ertellen: Container<> Container<> [] [] a a ([]) ([]) [100]; [100]; // // Warnung Warnung et(int et(int t) t) a[i] a[i] t; t; get(int get(int a[i]; a[i]; PI-1: Generiche Programmieren 17

Generiche (polymorphe) Methoden Definition Polymorphe Methoden ind unabhängig von generichen ypen Sie können auch in nicht-generichen Klaen definiert werden Klaen- und Objektmethoden owie Kontruktoren können polymorph ein ufruf thi.<>vote("foo", "foo","bar"); int i thi.<integer>vote(1,2,2); thi.<>vote(1,2,2); // Fehler! yp-inferenz vote("foo", "foo","bar"); <> <> vote( vote( x, x, y, y, z) z) if(x.equal(y)) if(x.equal(y)) x; x; ele ele if(y.equal(z)) if(y.equal(z)) y; y; ele ele if(z.equal(x)) if(z.equal(x)) z; z; ele ele nul nul ypparameter werden automatich mit dem unterten gemeinamen yp belegt Double d vote(1, 3.14, 1); // Fehler! entpricht Double d vote( Integer(1), Double(3.14), Integer(1)); // Fehler! Number n vote(1, 3.14, 1); // ok PI-1: Generiche Programmieren 18

Funktionen höherer Ordnung Definition Funktionen höherer Ordnung bekommen elbt Funktionen al Parameter In Java ind Funktionen al Parameter nicht möglich, wohl aber Objekte von Klaen, die betimmte Interface implementieren Beipiel: Faltung Eine Faltung faltet eine Lite (oder ein rray) zu einem einzigen Wert zuammen Dazu wird eine binäre Funktion der Reihe nach auf alle Elemente angewendet In Hakell: foldl (+) 0 [1,2,3,4,5] ((((0 + 1) + 2) + 3) + 4) + 5 interface interface FoldlFn<, FoldlFn<, B> B> fn( fn( a, a, B B b); b); <, <, B> B> foldl(foldlfn<, foldl(foldlfn<, B> B> f, f, a, a, B[] B[] b) b) for(b for(b b0 b0 : : b) b) a a f.fn(a, f.fn(a, b0); b0); a; a; concat([] concat([] object) object) foldl( foldl( FoldlFn<, FoldlFn<, >() >() public public fn( fn(,, o) o) + + o.to(); o.to();,, "", "", object); object); PI-1: Generiche Programmieren 19