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

Größe: px
Ab Seite anzeigen:

Download "A(T1) A(T2) A(T1) A(T2)"

Transkript

1 Kovarianz und Kontravarianz in Java Abstract In diesem Artikel werden die Java-Regeln für Kovarianz und Kontravarianz zusammengefasst. Hierzu wird Typkompatibilität definiert und die Fälle untersucht, wo abhängige Typen kompatibel sind oder nicht. Auch die Kompatibilität von Methoden wird erörtert. Definition Kovarianz und Kontravarianz ist die von Typen abhängige Kompatibilität. Ein von T abhängiges Element A(T) ist dann kovariant ( mit-verschieden ), wenn aus der Kompatibilität von T1 zu T2 die Kompatibilität von A(T1) zu A(T2) folgt. Wenn aus der Kompatibilität von T1 zu T2 die Kompatibilität von A(T2) zu A(T1) folgt, dann ist der Typ A(T) kontravariant ( gegenverschieden ). Wenn aus der Kompatibilität von T1 zu T2 keine Kompatibilität zwischen A(T1) und A(T2) folgt, dann ist A(T) invariant. T1 T2 A(T1) A(T2) A(T1) A(T2) Kovarianz und Kontravarianz In Java gibt es zwei Sprachelemente, die von Typen abhängig sind: Methoden und (abhängige) Typen. Es gibt zweierlei abhängige Typen: Reihungstypen (arrays) und generische (parametrisierte) Typen. Methoden sind von den Typen ihrer Parameter abhängig. Ein Reihungstyp T[] ist vom Typ seiner Elemente T abhängig. Ein generischer Typ G<T> ist von seinem Typparameter T abhängig. Kompatibilität unterschiedlicher Typen Der Typ T1 ist zu T2 implizit bzw. explizit kompatibel, wenn die Zuweisung einer Variable vom Typ T1 in eine Variable vom Typ T2 ohne bzw. mit Kennzeichnung möglich ist. Die häufigste Möglichkeit, explizite Kompatibilität zu kennzeichnen ist die Typkonvertierung (casting): variablevomtypt2 = variablevomtypt1; // implizit kompatibel variablevomtypt2 = (T2)variableVomTypT1; // explizit kompatibel Beispielsweise ist int implizit kompatibel zu long und explizit kompatibel zu short: int i = 5; long l = i; // implizit kompatibel short s = (short)i; // explizit kompatibel Implizite und explizite Kompatibilität besteht nicht nur bei Zuweisungen, sondern auch bei Parameterübergabe. Neben Eingabeparameter gehört dazu auch die Übergabe eines Funktionsergebnisses (als Ausgabeparameter). boolean ist mit keinem anderen Typ kompatibel; zwischen einem primitiven und einem Referenztyp besteht ebenfalls keine Kompatibilität. Eine Untertyp ist implizit kompatibel zum Obertyp, explizit in die andere Richtung. Referenztypen sind also nur innerhalb eines Hierarchiezweiges (aufwärts implizit und abwärts explizit) untereinander kompatibel: referenzvomuntertyp = referenzvomobertyp; // implizit kompatibel referenzvomobertyp = (Obertyp)referenzVomUntertyp; // explizit kompatibel

2 Der Java-Compiler erlaubt typischerweise implizite Kompatibilität für eine Zuweisung dort, wo zur Laufzeit keine Verluste durch die Unterschiede zwischen den Typen zu befürchten sind 1. Beispielsweise ist int implizit kompatibel zu long, weil eine long-variable jeden int- Wert aufnehmen kann. Im Gegensatz dazu kann eine short-variable nicht jeden int-wert aufnehmen deswegen wird hier nur explizite Kompatibilität erlaubt. char int long float double byte short Implizite Kompatibilität von arithmetischen Typen in Java 2 Ähnlich gelingt die Zuweisung einer Referenz vom Untertyp in eine Referenz vom Obertyp immer. Die Zuweisung in die andere Richtung kann eine Ausnahme ClassCastException auslösen 3. Kovarianz und Kontravarianz von Reihungen Die Kovarianz von Reihungstypen bedeutet, dass wenn T zu U kompatibel ist, dann ist T[] zu U[] auch kompatibel; Kontravarianz bedeutet, dass U[] zu T[]kompatibel ist. Reihungen aus primitiven Typen sind in Java invariant: longreihung = intreihung; // Typfehler shortreihung = (short[])intreihung; // Typfehler Reihungen aus Referenztypen sind jedoch in Java implizit kovariant und explizit kontravariant: Obertyp[] oberreihung; Untertyp[] unterreihung; oberreihung = unterreihung; // implizit kovariant unterreihung = (Untertyp[])oberreihung; // explizit kontravariant Hierdurch ist jedoch das sog. Kovarianzproblem entstanden. Dies bedeutet, dass eine Zuweisung von Reihungskomponenten zur Laufzeit die Ausnahme ArrayStoreException auslösen kann, wenn eine Obertyp-Reihungsreferenz eine Untertyp-Reihung referiert, ihrer Komponente jedoch ein Obertyp-Objekt zugewiesen werden soll: oberreihung[1] = new Obertyp(); // throws ArrayStoreException T2 T2[] T1 T1[] Kovarianz für Reihungen Das eigentliche Problem ist aber gar nicht die Ausnahme (die durch Programmdisziplin vermeidbar ist), sondern dass die Virtuelle Maschine zur Laufzeit jede Zuweisung auf ein Reihungselement in Bezug auf das Kovarianzproblem prüfen muss. Dies ist eine beträchtliche Effizienzverminderung gegenüber Sprachen ohne Kovarianz (wo eine kompatible Zuweisung für Reihungsreferenzen verboten ist) oder wo Kovarianz ausgeschaltet werden kann (wie z.b. in Scala). 1 Diese Regel gilt nicht für Genauigkeitsverluste, beispielsweise bei einer Zuweisung von int nach float. 2 Mit rotem Pfeil wurde der potentielle Genauigkeitsverlust dargestellt. 3 s. Typkompatibilität in Java unter

3 Ein einfaches Beispiel ist, wenn die Reihungsreferenz vom Typ Object[], das Reihungsobjekt und die Elemente jedoch von unterschiedlichen Klassen sind: Object[] reihung; // Reihungsreferenz reihung = new String[3]; // Reihungsobjekt; kovariante Zuweisung reihung[0] = new Integer(5); // throws ArrayStoreException Wegen der Kovarianz kann der Compiler die Korrektheit der Zuweisungen auf die Reihungselemente nicht überprüfen die JVM tut dies und erbringt dabei einen beträchtlichen Zusatzaufwand. Dieser kann jedoch vom Compiler optimiert werden, wenn von der Typkompatibilität zwischen Reihungstypen kein Gebrauch gemacht wird. Das Kovarianzproblem für Reihungen Unspezifische Kovarianz für parametrisierte Typen Generische (parametrisierte) Typen sind in Java implizit invariant, d.h. unterschiedliche Instanziierungen eines generischen Typs sind untereinander nicht kompatibel. Auch Typkonvertierung (casting) ermöglicht hier keine Kompatibilität: Generisch<Obertyp> obergenerisch; Generisch<Untertyp> untergenerisch; untergenerisch = (Generisch<Untertyp>)oberGenerisch; // Typfehler obergenerisch = (Generisch<Obertyp>)unterGenerisch; // Typfehler Der Typfehler wird gemeldet, obwohl untergenerisch.getclass() == obergenerisch.getclass() die Methode getclass() ermittelt nämlich den rohen (unparametrisierten) Typ. Dies ist der Grund, warum ein aktueller Typparameter nicht zu Signatur einer Methode gehört. Die beiden Methodenvereinbarungen void methode(generisch<obertyp>); void methode(generisch<untertyp>); dürfen daher nicht in derselben Schnittstellendefinition vorkommen. Obwohl generische Typen in Java implizit invariant sind, gibt es Variablen, die kovariant benutzt werden können. Sie werden mit Hilfe des Jokers (wildcard)? vereinbart, der als aktueller Typparameter eingesetzt werden darf. Generisch<?> ist der abstrakter Obertyp aller Instanziierungen des generischen Typs, d.h. zu Generisch<?> sind alle Instanziierungen von Generisch kompatibel: Generisch<?> jokerreferenz; jokerreferenz = new Generisch<String>(); // implizit kompatibel jokerreferenz = new Generisch<Integer>(); Da der Joker-Typ abstrakt ist, kann er nur für Referenzen und nicht für Objekte benutzt werden: new Generisch<?>() ergibt keinen Sinn und wird vom Compiler abgelehnt.

4 Ein Beispiel für die Verwendung des Jokers ist der Parameter einer Methode, die eine Sammlung (Collection oder Reihung) unabhängig vom Elementtyp manipuliert. Eine solche Methode für Reihungen zu schreiben ist wegen der Kovarianz einfach: static void swap(object[] reihung, int i, int j) { // vertauscht die Elemente i und j Der Aufruf kann für eine beliebige Reihung infolge der Kompatibilität zu Object erfolgen: Integer[] reihung = {1, 2, 3; swap(reihung, 0, 2); // Integer[] ist kompatibel zu Object[] Die generische Version 4 dieser Methode ist typsicherer 5 : static <T> void swap(t[] reihung, int i, int j) { Eine ähnliche Lösung für ArrayList funktioniert wegen Inkompatibilität für generische Typen nicht. Der Joker bewirkt jedoch Kovarianz: static void swap(list<?> liste, int i, int j) { // ähnlich Der Aufruf ist nun mit einem beliebigen Elementtyp möglich: List<Integer> liste = ; swap(liste, 0, 2); // List<Integer> ist kompatibel zu List<?> Eine solche Kompatibilität nennen wir unspezifische Kovarianz, weil hier nicht spezifiziert wird, welcher (Ober-) Typ die Kovarianz ermöglicht. Solche Kompatibilität kann sogar auf zwei Ebenen gleichzeitig bestehen: auf der Ebene der generischen Typen (ArrayList zu List) und auf der Ebene der Kovarianz (Integer zu?): ArrayList<Integer> arraylist = ; // ArrayList<T> implements List<T> swap(liste, 0, 2); // ArrayList<Integer> ist kompatibel zu List<?> Explizite Kovarianz für parametrisierte Typen Diese leichte Kovarianz kann man verallgemeinern. Implizite Kovarianz würde bestehen, wenn Generisch<Untertyp> zu Generisch<Obertyp> kompatibel wäre. Die Einschränkung des Jokers mit extends bewirkt dasselbe Effekt explizit: Generisch<Untertyp> ist kompatibel zu Generisch<? extends Obertyp>. Von diesem eingeschränkten Joker-Typ kann nun eine Referenz vereinbart werden: Generisch<? extends Obertyp> kovariantereferenz; In diese Referenz können beliebige Instanzen von Generisch eingehängt werden, deren aktueller Typparameter ein Untertyp von Obertyp ist: kovariantereferenz = new Generisch<Obertyp>(); kovariantereferenz = new Generisch<Untertyp>(); Die Einschränkung des Jokers ist dann sinnvoll, wenn nicht beliebige aktuelle Typparameter zugelassen werden sollen, weil von ihnen bestimmte Eigenschaften erwartet werden beispielsweise, wenn die Elemente der Parametersammlung manipuliert werden sollen: static void inkrement(number[] reihung) { // für jedes Element + 1 static void inkrement(collection<? extends Number> sammlung) { // ähnlich Der Aufruf der Methoden ist infolge der Kovarianz mit einem beliebigen Number-Parameter möglich: inkrement(reihung); // Integer[] ist kompatibel zu Number[] inkrement(liste); // ArrayList<Integer> ist kompatibel zu Collection<? extends Number> 4 Die beiden können aber nicht in derselben Klasse vereinbart werden, weil sie keine unterscheidbare Signatur haben. 5 Der Aufruf erfolgt nicht duch Kompatibilität sondern durch generische Instanziierung.

5 In der letzten Programmzeile wird Kompatibilität wieder gleichzeitig auf zwei Ebenen genutzt: Der parametrisierte ArrayList<T> ist ein Untertyp von Collection<T> und Integer ist ein Untertyp von Number. Der eingeschränkte Joker ermöglicht also explizite Kovarianz unter parametrisierten Typen. Kovarianter Typparameter als Parametertyp Diese Kovarianz wirkt über den Typparametern, nicht aber über den Parametertypen der Methoden in der generischen Klasse. Angenommen, in der Klasse Generisch benutzen wir den Typparameter T als Typ der (Ein- und Ausgabe-) Parametern von Methoden: class Generisch<T> { private T t; void schreiben(t t) { this.t = t; // T ist Eingabeparametertyp T lesen() { return t; // T ist Ausgabeparametertyp Dann kann die Methode schreiben mit jokerreferenz nicht direkt (nur nach Typkonvertierung) aufgerufen werden: jokerreferenz.schreiben(new Object()); // Typfehler ((Generisch<Object>)jokerReferenz).schreiben(new Object()); // OK Der Grund ist, dass zum Joker kein Typ (auch nicht Object) kompatibel ist -? ist eigentlich gar kein Typ. Der Joker selbst ist jedoch zu Object (und zu keinem anderen Typ) kompatibel, so kann das Typparameter-Ergebnis einer Funktion in eine Object-Referenz übernommen werden: Object o = jokerreferenz.lesen(); Für eingeschränkte Joker-Typen gelten dieselben Regeln: Eingabeparameter können nicht (nur nach casting) übergeben werden, Ausgabeparameter sind vom Typ der Schranke: kovariantereferenz.schreiben(new Obertyp()); // Typfehler kovariantereferenz.schreiben(new Untertyp()); // Typfehler ((Generisch<Obertyp>)kovarianteReferenz).schreiben(new Obertyp()); // OK ((Generisch<Obertyp>)kovarianteReferenz).schreiben(new Untertyp()); // OK ((Generisch<Untertyp>)kovarianteReferenz).schreiben(new Untertyp()); //OK Object objekt = kovariantereferenz.lesen(); // OK Obertyp ober = kovariantereferenz.lesen(); // OK Untertyp unter1 = kovariantereferenz.lesen(); // Typfehler Untertyp unter2 = ((Generisch<Untertyp>)kovarianteReferenz).lesen(); //OK Untertyp unter3 = (Untertyp)kovarianteReferenz.lesen(); // typunsicherer Man kann dies so interpretieren, dass der uneingeschränkte Joker-Typ durch Object eingeschränkt ist: Generisch<?> ist gleichwertig mit Generisch<? extends Object>. So gesehen ist die unspezifische Kovarianz eine explizite Kovarianz über die Kompatibilität zu Object. Kontravarianz für parametrisierte Typen Kontravarianz bedeutet die Kompatibilität in die andere Richtung, nämlich abwärts. Reihungen sind explizit kontravariant; syntaktisch wird dies durch Typkonvertierung (casting) ausgedrückt: unterreihung = (Untertyp[])oberreihung; // explizit kompatibel (kontravariant) Zwischen unterschiedlichen Instanziierungen eines generischen Typs wird die Typkonvertierung vom Compiler abgelehnt. Aber auch generische Typen sind explizit kontravariant. Syntaktisch wird dies ausgedrückt, indem man den Joker von unten mit Hilfe von super einschränkt: Generisch<? super Untertyp> kontravariantereferenz; In diese Variable können nun Instanziierungen von Generisch mit einem beliebigen Obertyp (z.b. Object) von Untertyp gehängt werden: kontravariantereferenz = new Generisch<Untertyp>(); // normal kontravariantereferenz = new Generisch<Obertyp>(); // kontravariant

6 kontravariantereferenz = new Generisch<Object>(); // auch möglich Hier findet also die Zuweisung von der Obertyp-Instanziierung (bzw. von noch weiter oben, von der Object-Instanziierung) nach unten, nämlich zur Untertyp-Instanziierung kontravariantereferenz statt dies heißt Kontravarianz. Ein Beispiel für die Anwendung der Kontravarianz ist die Methode java.util.collections.sort mit Comparator. Ihre Signatur ist public static <T> void sort(list<t> list, Comparator<? super T> c) Diese Methode sortiert eine beliebige Liste; die fürs Sortieren notwenige Element- Vergleichsmethode wird hier nicht im Elementtyp (etwa mit List<T extends Comparable<T>>, wie in der überladenen Version von sort) vereinbart, sondern in einem extra Comparator-Objekt. Der Vorteil hiervon ist, dass die Objekte nach verschiedenen Kriterien (z.b. einmal nach Namen, einmal nach Kundennummern) sortiert werden können. In den meisten Fällen würde hier Comparator<T> reichen, dessen Methode int compare(t o1, T o2) zwei beliebige Elemente im List<T>-Objekt miteinander vergleichen kann: class DateComparator implements Comparator<java.util.Date> { public int compare(date d1, Date d2) { return // vergleicht die zwei Date-Objekte List<java.util.Date> liste = ; // Liste aus Date-Objekten sort(liste, new DateComparator()); // sortiert die Liste Die Methode Collection.sort() deckt aber auch zusätzliche Fälle ab. Wegen des kontravarianten Typparameters von Comparable kann mit ihr auch eine Liste vom Typ List<java.sql.Date> sortiert werden, zumal java.util.date ein Obertyp von java.sql.date ist: List<java.sql.Date> sqlliste = ; sort(sqlliste, new DateComparator()); Ohne Kontravarianz (d.h. ohne <? super T>, nur mit <T> oder dem unspezifischen, typunsicheren <?> in der sort-signatur) würde die letzte Zeile vom Compiler als Typfehler abgelehnt werden man müsste dafür extra eine nichtssagende Klasse class SqlDateComparator extends DateComparator implements Comparator<java.sql.Date> { anfertigen, um sort(sqlliste, new SqlDateComparator()); aufrufen zu können. Nicht nur Collections.sort wurde mit einem kontravarianten Parameter versehen: Viele andere Methoden in Collections, wie addall, binarysearch, copy, fill usw. können ähnlich flexibel aufgerufen werden. Andere Methoden wie max und min haben kontravariante Ergebnistypen: public static <T extends Object & Comparable<? super T>> T max( Collection<? extends T> coll) Hier ist es ersichtlich, wie einem Typparameter mehrere Bedingungen mit Hilfe von & auferlegt werden können. Das überflüssig wirkende extends Object bewirkt hier, dass max im Bytecode (wo es keine Typparameter mehr gibt) ein Ergebnis vom Typ Object und nicht Comparable zurückgibt. Ihre überladene Comparator-Versionen public static <T> T max(collection<? extends T> coll, Comparator<? super T> comp) haben je einen kovarianten und einen kontravarianten Parameter: Während die Elemente der Collection Untertypen eines (nicht explizit angegebenen) Typs sein müssen, muss Comparator

7 für einen Obertyp desselben instanziiert worden sein. Eine hohe Intelligenz wird vom Inferenz- Algorithmus 6 des Compilers verlangt, um diesen Zwischentyp aus einem Aufruf wie Collection<EinTyp> sammlung = ; Comparator<EinAndererTyp> vergleicher = ; max(sammlung, vergleicher); ermitteln zu können. Noch interessanter ist die Signatur der Methode java.util.collections.sort mit Comparable; sie verwendet auch sowohl extends wie auch super, aber diesmal verschachtelt: public static <T extends Comparable<? super T>> void sort(list<t> list) Hier sprechen wir jedoch nicht von Ko- und Kontravarianz, weil es hier nicht um Kompatibilität von Referenzen geht, sondern um die Einschränkung der Instanziierung. Diese Methode sortiert also ein List-Objekt, dessen Elemente von einer Klasse sind, die Comparable implementiert. Diese generische Schnittstelle enthält die einzige Objektmethode int compareto(t o) die ihr Zielobjekt (vom Typ des Typparameters T) mit dem Parameterobjekt (ebenfalls vom Typ T) vergleicht. Ohne <? super T> (also nur mit <T>) in der sort-signatur würde das Sortieren in den meisten Fällen funktionieren: sort(liste); // java.util.date implements Comparable<java.util.Date> sort(sqlliste); // java.sql.date implements Comparable<java.sql.Date> Die Einschränkung des Typparameters von unten erlaubt aber zusätzliche Flexibilität: Comparable muss nicht unbedingt in der Elementklasse implementiert werden; es reicht, wenn sie für eine Oberklasse implementiert ist. Beispielsweise class Ober implements Comparable<Ober> { public int compareto(ober ober) { class Unter extends Ober { // ohne Überschreiben von compareto() List<Ober> oberliste = ; sort(oberliste); List<Unter> unterliste = ; sort(unterliste); Die letzte Zeile wird vom Compiler mit static <T extends Comparable<? super T>> void sort(list<t> list) { akzeptiert und mit static <T extends Comparable<T>> void sort(list<t> list) { abgelehnt. Der Grund für die Ablehnung ist, dass der Typ Unter (den der Compiler aus dem Typ List<Unter> des aktuellen Parameters unterliste ermittelt 7 ) nicht als aktueller Typparameter für T extends Comparable<T> geeignet ist: Unter implementiert Comparable<Unter> nämlich nicht, nur Comparable<Ober>; die beiden sind aber (mangels impliziter Kovarianz) nicht kompatibel, auch wenn Unter kompatibel zu Ober ist. Im anderen Fall (mit <? super T>) wird jedoch nicht erwartet, dass Comparable<Ober> von Unter implementiert wird; es reicht, wenn Ober das tut. Es reicht, weil die Methode compareto auch für Unter-Objekte aufgerufen werden kann: sie wird von Ober geerbt. Dies wird mit <? super T> ausgedrückt, was also Kontravarianz bewirkt. Die letzte Programmzeile könnte nur dann akzeptiert werden, wenn (kompliziertererweise) class Unter extends Ober { implements Comparable<Unter> { vereinbart worden wäre. 6 leitet geeignete unbekannte Typen aus bekannten Typen ab 7 durch Inferenz

8 Kontravarianter Typparameter als Parametertyp Allerdings, die obere oder untere Schranke bezieht sich nur auf den Typparameter der Instanziierungen, die in eine ko- oder kovariante Referenz eingehängt werden. Im Falle von Generisch<? extends Obertyp> kovariantereferenz; und Generisch<? super Untertyp> kontravariantereferenz; können also aus verschiedenen Generisch- Instanziierungen Objekte gebildet und eingehängt werden. Auf den Parameter- und Ergebnistyp der Methoden (also für Eingabe- und Ausgabeparametertypen) aus einem generischen Typ gelten andere Regeln. Beispielsweise kann als Parameter der Methode schreiben ein beliebiges Objekt übergeben werden, das zum Untertyp kompatibel ist: kontravariantereferenz.schreiben(new Untertyp()); // OK kontravariantereferenz.schreiben(new UnterUntertyp()); // auch OK kontravariantereferenz.schreiben(new Obertyp()); // Typfehler ((Generisch<? super Obertyp>)kontravarianteReferenz).schreiben( new Obertyp()); // OK Durch die Kontravarianz wird also die Parameterübergabe an schreiben()möglich im Gegensatz zum kovarianten (auch uneingeschränkten) Joker-Typ. Beim Ergebnistyp verändert sich die Situation durch Einschränkung nicht: lesen() liefert nach wie vor ein Ergebnis vom Typ?, das nur zu Object kompatibel ist: Object o = kontravariantereferenz.lesen(); Untertyp ut = kontravariantereferenz.lesen();// Typfehler Die letzte Zeile ist fehlerhaft, obwohl wir kontravariantereferenz vom Typ Generisch<? super Untertyp> vereinbart haben. Zu einem anderen Typ ist der Ergebnistyp nur nach expliziter Typkonvertierung der Referenz kompatibel: OberObertyp oo = ((Generisch<OberObertyp>)kontravarianteReferenz). lesen(); oo = (OberObertyp)kontravarianteReferenz.lesen(); // typunsicherere Alternative Erzeugung von Objekten Einerseits können von Joker-Typen (weil sie abstrakt sind) keine Objekte gebildet werden; andererseits können Reihungsobjekte nur von uneingeschränkten Joker-Typen (wie von allen abstrakten Typen), jedoch von keinen anderen generischen Instanziierungen gebildet werden: Generisch<Object>[] generischereihung; // OK generischereihung = new Generisch<Object>[20]; // Fehler Generisch<?>[] jokerreihung = new Generisch<?>[20]; // OK generischereihung = (Generisch<Object>[])jokerReihung; generischereihung[0] = new Generisch<Object>(); generischereihung[0] = new Generisch<String>(); // Typfehler jokerreihung[0] = new Generisch<String>(); // OK Wegen der Kovarianz für Reihungen ist hier der Joker-Reihungstyp der Obertyp der Reihungstypen aller Instanziierungen, deswegen ist die abwärtskompatible Zuweisung möglich. Vom Typparameter innerhalb einer generischen Klasse können auch keine Objekte erzeugt werden. Beispielsweise im Konstruktor einer eigenen ArrayList-Implementierung muss das Reihungsobjekt vom Typ Object[] erzeugt und zum Typparameter-Reihungstyp konvertiert werden: class MyArrayList<E> implements List<E> { private E[] inhalt; public MyArrayList(int größe) { inhalt = new E[größe]; // Fehler

9 inhalt = (E[])new Object[größe]; // workaround Mehrere Typparameter Ein generischer Typ kann mehrere Typparameter haben. Sie verändern das Verhalten bzgl. Ko- und Kontravarianz nicht; diese können auch zusammen vorkommen: class G<T1, T2> { G<? extends Obertyp,? super Untertyp> referenz; referenz = new G<Obertyp, Untertyp>(); // ohne Varianz referenz = new G<Untertyp, Obertyp>(); // Ko- und Kontravarianz Ein häufig verwendetes Beispiel für mehrere Typparameter ist die generische Schnittstelle java.util.map mit zwei Typparametern für Schlüssel K (key) und Werte V (value). Ihre Implementierung HashMap hat einen Konstruktor, der ein beliebiges Map-Objekt in eine Assoziationstabelle umwandelt: public HashMap(Map<? extends K,? extends V> t) Die Typparameter des Parameterobjekts t müssen dabei auch nicht auf die genauen Typparameter der Klasse K und V entsprechen, sondern können kovariant angepasst werden: Map<Kundennummer, Kunde> kunden; kontakte = new HashMap<Id, Person>(kunden); // kovariant wobei Id ein Obertyp von Kundennummer und Person ein Obertyp von Kunde ist. Abhängigkeit von Methoden Eine Methode ist vom Typ seiner Parameter abhängig. Neben den Eingabeparametern zählen wir auch ihren Ergebnistyp (return type) als Ausgabeparameter hinzu. Die Signatur einer Methode bestimmen jedoch nur die Eingabeparametertypen. Methoden mit unterschiedlichen Namen oder mit einer unterschiedlichen Anzahl von Parametern sind zueinander nicht kompatibel. Die Frage nach Kompatibilität stellt sich also nur bei Methoden mit demselben Namen und gleicher Anzahl von Parametern 8. Hierbei kann ein Methodenaufruf (im Rumpf einer Klasse) zu Methodendefinitionen (in Klassen) und zu Methodenvereinbarungen (in abstrakten Klassen und Schnittstellen) kompatibel oder inkompatibel sein. Bei einer Methodendefinition wird die Frage nach Kompatibilität zu anderen Definitionen oder Vereinbarungen, bei einer Methodenvereinbarungen zu anderen Vereinbarungen gestellt, um zu entscheiden, ob es sich hier um Überschreiben oder Überladen handelt. kovariant invariant Abhängigkeiten von Methoden bezüglich Signatur 8 wobei der letzte Parameter auch eine variable Anzahl ermöglicht.

10 Bei der Kompatibilität zwischen Vereinbarungen und Definitionen gibt es in Java keine Varianz in Bezug auf die Signatur: Wenn eine Methode eine andere überschreibt, müssen die Signaturen gleich sein. Es gilt jedoch Kovarianz in Bezug auf den Ergebnistyp: interface Ober { void prozedur(obertyp parameter); Obertyp funktion(); interface Unter extends Ober { void prozedur(untertyp parameter); // Untertyp funktion(); // überschrieben Nach den strengen Java-Regeln für Signaturen wird hier prozedur überschrieben, nicht überladen: Eine für prozedur würde eine Fehlermeldung des Compilers auslösen, weil der Parametertyp von prozedur in den beiden Schnittstellen nicht gleich ist. In anderen Sprachen (wie Ada oder Scala) wird Überschreiben auch mit ko- oder kontravarianten Methodenparametern ermöglicht. Im Gegensatz dazu gehört der Ergebnistyp einer Funktion nicht zu Signatur; somit kann er beim Überschreiben (wie oben) erweitert (aber nicht anders verändert) werden: Methodenvereinbarungen und -definitionen bzgl. Ergebnistypen sind in Java kovariant. Ob nun ein Aufruf zu einer Vereinbarung oder Definition kompatibel ist, wird aufgrund der Signatur entschieden. Hier gilt Kovarianz: Aus der Typkompatibilität der Parameter nach oben folgt die Kompatibilität des Aufrufs. Bezüglich Zielobjekts eines Aufrufs sprechen wir jedoch nicht von Varianz sondern von Polymorphie: oberreferenz.prozedur(untertypparameter); // Aufruf ist kovariant bezüglich Signatur unterreferenz.prozedur(obertypparameter); // polymorph Bezüglich Funktionsergebnisse beim Aufruf sprechen wir nicht von Varianz sondern einfach von Aufwärtskompatibilität: Obertyp ergebnis = unterreferenz.funktion(); // aufwärtskompatibel Untertyp ergebnis = oberreferenz.funktion(); // Typfehler: nicht abwärtskompatibel Manchmal wird diese Aufwärtskompatibilität jedoch als Kovarianz bezeichnet. Der Zugriffschutz und die Ausnahmespezifikation gehört wie das Funktionsergebnis nicht zur Signatur. Diese können beim Überschreiben erweitert werden. Auch final kann hinzugefügt werden, das weiteres Überschreiben unterbindet: class Oberklasse { void methode() throws OberException { class Unterklasse extends Oberklasse public final void methode() throws UnterException { Zusammenfassung Kovarianz und Kontravarianz ist die Kompatibilität typabhängiger Sprachelemente. In Java sind Reihungstypen (arrays) implizit kovariant und explizit (durch Typkonvertierung, casting) kontravariant. Parametrisierte (generische) Typen sind implizit invariant. Auch durch Typkonvertierung wird keine Ko- und Kontravarianz ermöglicht. Ko- und Kontravarianz kann für parametrisierte Typen jedoch durch Einschränkung des Jokers vereinbart werden: Kovarianz durch

11 Einschränkung von oben (<? extends Schranke>), Kontravarianz durch Einschränkung von unten (<? super Schranke>). Joker-Typen (Instanziierungen eines parametrisierten Typs mit dem Joker) sind abstrakt, daher können mit ihnen nur Referenzen vereinbart werden. Methodenaufrufe zu Definitionen und Vereinbarungen sind kovariant bezüglich Signatur. Methodendefinitionen und -vereinbarungen untereinander sind in Java invariant.

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

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala Das Typsystem von Scala 1 Eigenschaften Das Typsystem von Scala ist statisch, implizit und sicher 2 Nichts Primitives Alles ist ein Objekt, es gibt keine primitiven Datentypen scala> 42.hashCode() res0:

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

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

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {... PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:

Mehr

Gebundene Typparameter

Gebundene Typparameter Gebundene Typparameter interface StringHashable { String hashcode(); class StringHashMap { public void put (Key k, Value v) { String hash = k.hashcode();...... Objektorientierte

Mehr

Typumwandlungen bei Referenztypen

Typumwandlungen bei Referenztypen Typumwandlungen bei Referenztypen Genau wie es bei einfachen Typen Typumwandlungen gibt, gibt es auch bei Referenztypen Umwandlungen von einem Referenztypen in einen anderen Referenztypen, die wie bei

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

1 Polymorphie (Vielgestaltigkeit)

1 Polymorphie (Vielgestaltigkeit) 1 Polymorphie (Vielgestaltigkeit) Problem: Unsere Datenstrukturen List, Stack und Queue können einzig und allein int-werte aufnehmen. Wollen wir String-Objekte, andere Arten von Zahlen oder andere Objekttypen

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

Innere Klassen in Java

Innere Klassen in Java Innere Klassen in Java SS 2012 Prof. Dr. Margarita Esponda Innere Klassen Klassen- oder Interfacedefinitionen können zur besseren Strukturierung von Programmen verschachtelt werden Eine "Inner Class" wird

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

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

Institut für Programmierung und Reaktive Systeme 25. August 2014. Programmier-Labor. 04. + 05. Übungsblatt. int binarysearch(int[] a, int x), Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme 25. August 2014 Programmier-Labor 04. + 05. Übungsblatt Aufgabe 21: a) Schreiben Sie eine Methode

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Computeranwendung und Programmierung (CuP)

Computeranwendung und Programmierung (CuP) Computeranwendung und Programmierung (CuP) VO: Peter Auer (Informationstechnologie) UE: Norbert Seifter (Angewandet Mathematik) Organisatorisches (Vorlesung) Vorlesungszeiten Montag 11:15 12:45 Freitag

Mehr

Vererbung & Schnittstellen in C#

Vererbung & Schnittstellen in C# Vererbung & Schnittstellen in C# Inhaltsübersicht - Vorüberlegung - Vererbung - Schnittstellenklassen - Zusammenfassung 1 Vorüberlegung Wozu benötigt man Vererbung überhaubt? 1.Um Zeit zu sparen! Verwendung

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

Mehr

Client-Server Beziehungen

Client-Server Beziehungen Ersetzbarkeit, Client-Server Beziehungen 182.132 VL Objektorientierte Programmierung Peter Puschner nach Folien von Franz Puntigam, TU Wien Überblick Ersetzbarkeit Kovarianz, Kontravarianz, Invarianz Client-Server

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Universität der Bundeswehr Fakultät für Informatik Institut 2 Priv.-Doz. Dr. Lothar Schmitz FT 2006 Zusatzaufgaben Lösungsvorschlag Objektorientierte Programmierung Lösung 22 (Java und UML-Klassendiagramm)

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung Kapitel 6 Vererbung Vererbung 1 Ziele Das Vererbungsprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen

Mehr

Javakurs zu Informatik I. Henning Heitkötter

Javakurs zu Informatik I. Henning Heitkötter Javakurs zu Informatik I Arrays vergleichen Implementieren Sie folgende Methode, die prüft, ob die Elemente der beiden Arrays an jeder Position übereinstimmen: public static boolean identisch(int[] a,

Mehr

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren: 5. Abstrakte Klassen Beispiel 5. Abstrakte Klassen 5. Abstrakte Klassen Beispiel Beispiel (3) Angenommen, wir wollen die folgende Klassenhierarchie implementieren: Probleme des Implementierungsvorschlags:

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags Pommes... Praktikum A 230 C 207 (Madeleine) F 112 F 113 (Kevin) E

Mehr

1. Einführung 2. 2. Erstellung einer Teillieferung 2. 3. Erstellung einer Teilrechnung 6

1. Einführung 2. 2. Erstellung einer Teillieferung 2. 3. Erstellung einer Teilrechnung 6 Inhalt 1. Einführung 2 2. Erstellung einer Teillieferung 2 3. Erstellung einer Teilrechnung 6 4. Erstellung einer Sammellieferung/ Mehrere Aufträge zu einem Lieferschein zusammenfassen 11 5. Besonderheiten

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden. Einfache Ein- und Ausgabe mit Java 1. Hallo-Welt! Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden. /** Die Klasse hello sendet einen

Mehr

5. Abstrakte Klassen

5. Abstrakte Klassen 5. Abstrakte Klassen Beispiel 5. Abstrakte Klassen Angenommen, wir wollen die folgende Klassenhierarchie implementieren: Vogel Amsel Drossel Fink Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg,

Mehr

Access [basics] Gruppierungen in Abfragen. Beispieldatenbank. Abfragen gruppieren. Artikel pro Kategorie zählen

Access [basics] Gruppierungen in Abfragen. Beispieldatenbank. Abfragen gruppieren. Artikel pro Kategorie zählen Abfragen lassen sich längst nicht nur dazu benutzen, die gewünschten Felder oder Datensätze einer oder mehrerer Tabellen darzustellen. Sie können Daten auch nach bestimmten Kriterien zu Gruppen zusammenfassen

Mehr

Prinzipien Objektorientierter Programmierung

Prinzipien Objektorientierter Programmierung Prinzipien Objektorientierter Programmierung Valerian Wintner Inhaltsverzeichnis 1 Vorwort 1 2 Kapselung 1 3 Polymorphie 2 3.1 Dynamische Polymorphie...................... 2 3.2 Statische Polymorphie........................

Mehr

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

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion

Mehr

Testen mit JUnit. Motivation

Testen mit JUnit. Motivation Test First Design for Test in Eclipse (eigentlich: ) zu einer Klasse Beispiel zur Demonstration Ergänzungen Test First "Immer dann, wenn Du in Versuchung kommst, etwas wie eine print- Anweisung oder einen

Mehr

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

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung M. Graefenhan 2000-12-07 Aufgabe Lösungsweg Übungen zu C Blatt 3 Musterlösung Schreiben Sie ein Programm, das die Häufigkeit von Zeichen in einem eingelesenen String feststellt. Benutzen Sie dazu ein zweidimensionales

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

4. BEZIEHUNGEN ZWISCHEN TABELLEN

4. BEZIEHUNGEN ZWISCHEN TABELLEN 4. BEZIEHUNGEN ZWISCHEN TABELLEN Zwischen Tabellen können in MS Access Beziehungen bestehen. Durch das Verwenden von Tabellen, die zueinander in Beziehung stehen, können Sie Folgendes erreichen: Die Größe

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine

Mehr

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

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6 Gudrun Fischer Sascha Kriewel programmierung@is.informatik.uni-duisburg.de Anmeldung zur Klausur! Übungsblatt Nr. 6 Um an der Klausur teilzunehmen, müssen sich Studierende der angewandten Informatik in

Mehr

Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken?

Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken? UErörterung zu dem Thema Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken? 2000 by christoph hoffmann Seite I Gliederung 1. In zu großen Mengen ist alles schädlich. 2.

Mehr

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

Mehr

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

Rundung und Casting von Zahlen

Rundung und Casting von Zahlen W E R K S T A T T Rundung und Casting von Zahlen Intrexx 7.0 1. Einleitung In diesem Werkstattbeitrag erfahren Sie, wie Zahlenwerte speziell in Velocity, aber auch in Groovy, gerundet werden können. Für

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen 1. Quadratische Gleichungen Quadratische Gleichungen lassen sich immer auf die sog. normierte Form x 2 + px + = 0 bringen, in

Mehr

Client-Server-Beziehungen

Client-Server-Beziehungen Client-Server-Beziehungen Server bietet Dienste an, Client nutzt Dienste Objekt ist gleichzeitig Client und Server Vertrag zwischen Client und Server: Client erfüllt Vorbedingungen eines Dienstes Server

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

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

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015 Software Engineering Zur Architektur der Applikation Data Repository Franz-Josef Elmer, Universität Basel, HS 2015 Software Engineering: Mit acht bewährten Praktiken zu gutem Code 2 Schichtarchitektur

Mehr

Große Übung Praktische Informatik 1

Große Übung Praktische Informatik 1 Große Übung Praktische Informatik 1 2005-12-08 fuessler@informatik.uni-mannheim.de http://www.informatik.uni-mannheim.de/pi4/people/fuessler 1: Announcements / Orga Weihnachtsklausur zählt als Übungsblatt,

Mehr

Whitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager email-rückläufer Script. combit GmbH Untere Laube 30 78462 Konstanz

Whitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager email-rückläufer Script. combit GmbH Untere Laube 30 78462 Konstanz combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit Relationship Manager 7 combit Relationship Manager email-rückläufer Script Inhalt Einleitung 3 Notwendige Anpassungen 3 crm Solution

Mehr

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

Prof. Dr. Uwe Schmidt. 21. August 2007. Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252) Prof. Dr. Uwe Schmidt 21. August 2007 Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252) Zeit: 75 Minuten erlaubte Hilfsmittel: keine Bitte tragen Sie Ihre Antworten und fertigen

Mehr

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

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

Folge 18 - Vererbung

Folge 18 - Vererbung Workshop Folge 18 - Vererbung 18.1 Ein einfacher Fall der Vererbung Schritt 1 - Vorbereitungen Besorgen Sie sich - vielleicht aus einer der Übungen der Folge 17 - ein fertiges und lauffähiges Listenprojekt,

Mehr

Der lokale und verteilte Fall

Der lokale und verteilte Fall Lokale Beans Der lokale und verteilte Fall RemoteClient Lokaler Client (JSP) RemoteSession/Entity-Bean Lokale Session/Entity-Bean 2 Lokale Beans Die bisher vorgestellten EJBswaren immer in der Lage auf

Mehr

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Klausur zur Einführung in die objektorientierte Programmierung mit Java Klausur zur Einführung in die objektorientierte Programmierung mit Java im Studiengang Informationswissenschaft Prof. Dr. Christian Wolff Professur für Medieninformatik Institut für Medien-, Informations-

Mehr

4. AuD Tafelübung T-C3

4. AuD Tafelübung T-C3 4. AuD Tafelübung T-C3 Simon Ruderich 17. November 2010 Arrays Unregelmäßige Arrays i n t [ ] [ ] x = new i n t [ 3 ] [ 4 ] ; x [ 2 ] = new i n t [ 2 ] ; for ( i n t i = 0; i < x. l e n g t h ; i ++) {

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler Downloadfehler in DEHSt-VPSMail Workaround zum Umgang mit einem Downloadfehler Downloadfehler bremen online services GmbH & Co. KG Seite 2 Inhaltsverzeichnis Vorwort...3 1 Fehlermeldung...4 2 Fehlerbeseitigung...5

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Einführung in Java PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Gliederung 1. Was ist Java / Geschichte von Java 2. Prinzip der Plattformunabhängigkeit 3. Wie kommt man vom Quellcode zum Programm

Mehr

Abschnitt 9: Schnittstellen: Interfaces

Abschnitt 9: Schnittstellen: Interfaces Abschnitt 9: Schnittstellen: Interfaces 9. Schnittstellen: Interfaces 9.1 Die Idee der Schnittstellen 9.2 Schnittstellen in Java 9.3 Marker-Interfaces 9.4 Interfaces und Hilfsklassen 9.5 Zusammenfassung

Mehr

1 Einleitung. Lernziele. automatische Antworten bei Abwesenheit senden. Einstellungen für automatische Antworten Lerndauer. 4 Minuten.

1 Einleitung. Lernziele. automatische Antworten bei Abwesenheit senden. Einstellungen für automatische Antworten Lerndauer. 4 Minuten. 1 Einleitung Lernziele automatische Antworten bei Abwesenheit senden Einstellungen für automatische Antworten Lerndauer 4 Minuten Seite 1 von 18 2 Antworten bei Abwesenheit senden» Outlook kann während

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

Die Captimizer BTZ-Datei 2015

Die Captimizer BTZ-Datei 2015 Dipl.-Math. Rainer Schwindt Captimizer s Secrets behind the User Interface 2 Die Captimizer BTZ-Datei 2015 Regeln zur BTZ bei laufendem Navigator und Navigator-Neustart beim Jahreswechsel Geheimnisse hinter

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

Mehr

Delegatesund Ereignisse

Delegatesund Ereignisse Delegatesund Ereignisse «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Definition eines Ereignisses

Mehr

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

Datenaufbereitung in SPSS. Daten zusammenfügen

Datenaufbereitung in SPSS. Daten zusammenfügen Daten zusammenfügen I. Fälle hinzufügen Diese Schritte müssen Sie unternehmen, wenn die Daten in unterschiedlichen Dateien sind; wenn also die Daten von unterschiedlichen Personen in unterschiedlichen

Mehr

Charakteristikum des Gutachtenstils: Es wird mit einer Frage begonnen, sodann werden die Voraussetzungen Schritt für Schritt aufgezeigt und erörtert.

Charakteristikum des Gutachtenstils: Es wird mit einer Frage begonnen, sodann werden die Voraussetzungen Schritt für Schritt aufgezeigt und erörtert. Der Gutachtenstil: Charakteristikum des Gutachtenstils: Es wird mit einer Frage begonnen, sodann werden die Voraussetzungen Schritt für Schritt aufgezeigt und erörtert. Das Ergebnis steht am Schluß. Charakteristikum

Mehr

Lehrer: Einschreibemethoden

Lehrer: Einschreibemethoden Lehrer: Einschreibemethoden Einschreibemethoden Für die Einschreibung in Ihren Kurs gibt es unterschiedliche Methoden. Sie können die Schüler über die Liste eingeschriebene Nutzer Ihrem Kurs zuweisen oder

Mehr

Programmieren I. Kapitel 15. Ein und Ausgabe

Programmieren I. Kapitel 15. Ein und Ausgabe Programmieren I Kapitel 15. Ein und Ausgabe Kapitel 15: Ein und Ausgabe Ziel: einen kleinen Einblick in die vielfältigen IO Klassen geben Grober Überblick Klasse File zur Verwaltung von Dateien Random

Mehr

LU-Zerlegung. Zusätze zum Gelben Rechenbuch. Peter Furlan. Verlag Martina Furlan. Inhaltsverzeichnis. 1 Definitionen.

LU-Zerlegung. Zusätze zum Gelben Rechenbuch. Peter Furlan. Verlag Martina Furlan. Inhaltsverzeichnis. 1 Definitionen. Zusätze zum Gelben Rechenbuch LU-Zerlegung Peter Furlan Verlag Martina Furlan Inhaltsverzeichnis Definitionen 2 (Allgemeine) LU-Zerlegung 2 3 Vereinfachte LU-Zerlegung 3 4 Lösung eines linearen Gleichungssystems

Mehr

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 4 Die Datenbank Kuchenbestellung In diesem Kapitel werde ich die Theorie aus Kapitel 2 Die Datenbank Buchausleihe an Hand einer weiteren Datenbank Kuchenbestellung

Mehr

Factory Method (Virtual Constructor)

Factory Method (Virtual Constructor) Factory Method (Virtual Constructor) Zweck: Definition einer Schnittstelle für Objekterzeugung Anwendungsgebiete: Klasse neuer Objekte bei Objekterzeugung unbekannt Unterklassen sollen Klasse neuer Objekte

Mehr

Kinderarmut. 1. Kapitel: Kinderarmut in der Welt

Kinderarmut. 1. Kapitel: Kinderarmut in der Welt Kinderarmut 1. Kapitel: Kinderarmut in der Welt Armut gibt es überall auf der Welt und Armut ist doch sehr unterschiedlich. Armut? Was ist das? Woher kommt das? wieso haben die einen viel und die anderen

Mehr

Erstellen von x-y-diagrammen in OpenOffice.calc

Erstellen von x-y-diagrammen in OpenOffice.calc Erstellen von x-y-diagrammen in OpenOffice.calc In dieser kleinen Anleitung geht es nur darum, aus einer bestehenden Tabelle ein x-y-diagramm zu erzeugen. D.h. es müssen in der Tabelle mindestens zwei

Mehr

Gezielt über Folien hinweg springen

Gezielt über Folien hinweg springen Gezielt über Folien hinweg springen Nehmen wir an, Sie haben eine relativ große Präsentation. Manchmal möchten Sie über Folien hinweg zu anderen Folien springen. Das kann vorkommen, weil Sie den gesamten

Mehr

Zeichen bei Zahlen entschlüsseln

Zeichen bei Zahlen entschlüsseln Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren

Mehr

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich 13 OOP MIT DELPHI Delphi war früher "Object Pascal". Dieser Name impliziert eine Funktionalität, welche in der Welt der Programmierung nicht mehr wegzudenken ist: die objektorientierte Programmierung,

Mehr

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN Karlsruhe, April 2015 Verwendung dichte-basierter Teilrouten Stellen Sie sich vor, in einem belebten Gebäude,

Mehr

4 Aufzählungen und Listen erstellen

4 Aufzählungen und Listen erstellen 4 4 Aufzählungen und Listen erstellen Beim Strukturieren von Dokumenten und Inhalten stellen Listen und Aufzählungen wichtige Werkzeuge dar. Mit ihnen lässt sich so ziemlich alles sortieren, was auf einer

Mehr

Terminabgleich mit Mobiltelefonen

Terminabgleich mit Mobiltelefonen Terminabgleich mit Mobiltelefonen Sie können Termine- und Aufgaben aus unserem Kalender, sowie die Adressdaten aus dem Hauptprogramm mit Ihrem Mobiltelefon abgleichen. MS Outlook dient dabei als Schnittstelle

Mehr

Java Einführung Collections

Java Einführung Collections Java Einführung Collections Inhalt dieser Einheit Behälterklassen, die in der Java API bereitgestellt werden Wiederholung Array Collections (Vector, List, Set) Map 2 Wiederholung Array a[0] a[1] a[2] a[3]...

Mehr

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

Mehr

Animationen erstellen

Animationen erstellen Animationen erstellen Unter Animation wird hier das Erscheinen oder Bewegen von Objekten Texten und Bildern verstanden Dazu wird zunächst eine neue Folie erstellt : Einfügen/ Neue Folie... Das Layout Aufzählung

Mehr

Webalizer HOWTO. Stand: 18.06.2012

Webalizer HOWTO. Stand: 18.06.2012 Webalizer HOWTO Stand: 18.06.2012 Copyright 2003 by manitu. Alle Rechte vorbehalten. Alle verwendeten Bezeichnungen dienen lediglich der Kennzeichnung und können z.t. eingetragene Warenzeichen sein, ohne

Mehr

SEP 114. Design by Contract

SEP 114. Design by Contract Design by Contract SEP 114 Design by Contract Teile das zu entwickelnde Programm in kleine Einheiten (Klassen, Methoden), die unabhängig voneinander entwickelt und überprüft werden können. Einheiten mit

Mehr

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Lösungsvorschläge. zu den Aufgaben im Kapitel 4 Lösungsvorschläge zu den Aufgaben im Kapitel 4 Aufgabe 4.1: Der KNP-Algorithmus kann verbessert werden, wenn in der Funktion nexttabelle die Zuweisung next[tabindex] = ruecksprung; auf die etwas differenziertere

Mehr

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich Mitgliederbereich (Version 1.0) Bitte loggen Sie sich in den Mitgliederbereich mit den Ihnen bekannten Zugangsdaten

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 22

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 22 Kapitel 19 Vererbung, UML Seite 1 von 22 Vererbung - Neben der Datenabstraktion und der Datenkapselung ist die Vererbung ein weiteres Merkmal der OOP. - Durch Vererbung werden die Methoden und die Eigenschaften

Mehr

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005 Einführung in die objektorientierte Programmierung mit Java Klausur am 19. Oktober 2005 Matrikelnummer: Nachname: Vorname: Semesteranzahl: Die Klausur besteht aus drei Frageblöcken zu den Inhalten der

Mehr

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen Menü Macro WinIBW2-Macros unter Windows7?... 1 Macros aufnehmen... 1 Menübefehle und Schaltflächen in Macros verwenden... 4 Macros bearbeiten... 4 Macros löschen... 5 Macro-Dateien... 5 Macros importieren...

Mehr

5.2 Neue Projekte erstellen

5.2 Neue Projekte erstellen 5.2 Neue Projekte erstellen Das Bearbeiten von bestehenden Projekten und Objekten ist ja nicht schlecht wie aber können Sie neue Objekte hinzufügen oder gar völlig neue Projekte erstellen? Die Antwort

Mehr

Dokumentenverwaltung im Internet

Dokumentenverwaltung im Internet Dokumentenverwaltung im Internet WS 09/10 mit: Thema: Workflow und Rollenverteilung im Backend Gruppe: DVI 10 Patrick Plaum und Kay Hofmann Inhalt 1. Benutzer und Benutzergruppen erstellen...2 1.1. Benutzergruppen...2

Mehr

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014)

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014) Handbuch NAFI Online-Spezial 1. Auflage (Stand: 24.09.2014) Copyright 2016 by NAFI GmbH Unerlaubte Vervielfältigungen sind untersagt! Inhaltsangabe Einleitung... 3 Kundenauswahl... 3 Kunde hinzufügen...

Mehr

AutoTexte und AutoKorrektur unter Outlook verwenden

AutoTexte und AutoKorrektur unter Outlook verwenden AutoTexte und AutoKorrektur unter Outlook verwenden Die Hilfsmittel "AutoKorrektur" und "AutoTexte", die schon unter Microsoft Word das Arbeiten erleichtern, sind natürlich auch unter Outlook verfügbar.

Mehr

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung Problem: Um AutoCAD abwechselnd auf mehreren Rechnern einsetzen zu können konnte man bis AutoCAD 2000 einfach den Dongle umstecken. Seit AutoCAD 2000i

Mehr