Vorlesung Inf-B

Ähnliche Dokumente
Polymorphie in Java oder Generics und Co.

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

1 Polymorphie (Vielgestaltigkeit)

Java Einführung Abstrakte Klassen und Interfaces

Java 5 "Tiger" Erweiterungen

Java: Vererbung. Teil 3: super()

Objektorientierte Programmierung

Java Generics & Collections

Java Schulung. Objektorientierte Programmierung in Java Teil V: Die Java Collection Klassen. Prof. Dr. Nikolaus Wulff

Algorithmen und Datenstrukturen 07

Kapitel 6. Vererbung

Java Einführung Collections

Kapitel 6. Vererbung

Distributed Computing Group

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

Kapitel 6. Vererbung

Algorithmen und Datenstrukturen

Java-Schulung Grundlagen

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

Objektorientierte Programmierung

Java - Programmierung - Objektorientierte Programmierung 1

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

Probeklausur: Programmierung WS04/05

3 Objektorientierte Konzepte in Java

Prinzipien Objektorientierter Programmierung

Versuchsziele Kenntnisse in der Anwendung von: Sortieren mit Klassen Benutzung von generischen Klassen o Definition o Sortierung.

Repetitorium Informatik (Java)

Programmieren in Java

Datenbankanwendungsprogrammierung Crashkurs Java

Generische Typen in Java

Vorlesung Programmieren

Java für Computerlinguisten

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

Typumwandlungen bei Referenztypen

Institut fu r Informatik

Fortgeschrittene Programmierung

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Objektorientierte Programmierung

equals und hashcode SortedSet NavigableSet Assoziative Container Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester / 32

Teil 1: Grundeigenschaften von Rechnern und Software

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

Java Schulung (Java 2 Java Development Kit 5 / 6)

Schnittstellen implementieren am Beispiel Suchbaum

Aufgabenblatt Nr. 5 Generizität und TicTacToe

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

5. Tutorium zu Programmieren

3. Konzepte der objektorientierten Programmierung

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

Ein erstes Java-Programm

Persistenz von Objekten relationale Datenbank Eigene Datenstruktur XML (JAXB) Proprietäre Dateiformate (Lochkarten)

Programmieren in Java

Java-Vorkurs Wintersemester 15/16

3 Objektorientierte Konzepte in Java

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Grundlagen der Informatik Generische Klassen

von Anja Austermann Drag and Drop

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Objektorientierte Programmierung. Kapitel 12: Interfaces

1. Grundlegende Konzepte in Java (6 Punkte)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Neue Features in C# 2.0

Android will doch nur spielen. Java Eine kurze Einführung

Musterlösungen zur Klausur Informatik 3

Generische Datenstrukturen

Praktikum Informatik II Prof. Dr. Martin Trauth, Dr. Michael Männel

1. Der Einstieg in Java. Was heißt Programmieren?

5.6 Vererbung. Vererbung

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

Klausur zur Einführung in die objektorientierte Programmierung mit Java

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

Teilprüfung Software- und Internettechnologie Programmierkurs 1 Wintersemester 2005/2006

Java-Programmierung. Remote Method Invocation - RMI

Betreutes Programmieren Vorlesung Informatik II, Blatt 7 Musterlösung

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

12) Generische Datenstrukturen

Typische Probleme. 7. Performance und Speicherauslastung. Parameter von java mit Performance-Einfluss. Parameter von javac mit Performance-Einfluss

Teil 1: Grundeigenschaften von Rechnern und Software

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Formale Spezialisierungstechniken. am Beispiel des binären Baums. Hybride Programmiersprachen Daniel Krompass Berlin, 2009

Beispiel: DB-Mock (1/7)

Objekt-Orientierte Programmierung

12) Generische Datenstrukturen

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

2.4.3 Polymorphie (Wiederholung von Alp2)

Klassenbeziehungen & Vererbung

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Christian-Albrechts-Universität zu Kiel

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

Variablen manipulieren per JDI

Graphische Benutzungsoberflächen

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

Studentische Lösung zum Übungsblatt Nr. 7

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Auszug aus. C sharp. Galileo Computing. Ein Service von. Tutorial und Referenz. von Eric Gunnerson

Erreichbarkeit von Klassenelementen. Daten verstecken und kapseln

Transkript:

Vorlesung Inf-B stehn@mi.fu-berlin.de

Quelle Diese Folien basieren auf dem Java-Tutorial Generics von Gilad Bracha http://java.sun.com/docs/books/tutorial/extra/generics/ 2

Motivierendes Beispiel List myintlist = new LinkedList(); myintlist.add(new Integer(42)); Integer x = (Integer) myintlist.iterator().next(); Es muss immer nach Integer gecastet werden, auch wenn der Programmierer weiss, dass myintlist nur Integers entghält 3

Die Lösung: Generics List<Integer> myintlist = new LinkedList<Integer>(); myintlist.add(new Integer(0)); Integer x = myintlist.iterator().next(); Generics sind Klassen- oder Interface Definitionen mit Typparametern Das bedeutet, dass die Informationen über alle Typen einer generischen Klasse (eines generischen Interfaces) erst zur Laufzeit bekannt sind. 4

Beispiele für Generics Auszug aus java.util.list und java.util.iterator Intuition public interface List <E>{ void add(e x); Iterator<E> iterator(); public interface Iterator<E>{ E next(); boolean hasnext(); zur Laufzeit werden alle Vorkommen von E durch den zur Laufzeit angegebenen Typen ersetzt. Hinweis Java lässt nur Referenz- Typen als Typparameter zu. (z.b., kein bool, int, float,...) 5

Konventionen In Java werden Typ-Parameter üblicherweise mit einem einzelnen Grossbuchstaben benannt public interface List <E>{ void add(e x); Iterator<E> iterator(); public interface Iterator<E>{ E next(); boolean hasnext(); 6

Syntax für die Definition eines Typ-Parameters Syntax Typ-Parameter Typ-Parameter: Typ-Variable [Begrenzung] Begrenzung: extends Klassen-Typ [Begrenzungs-Liste] extends Interface-Typ [Begrenzungs-Liste] Begrenzungs-Liste: Weitere-Begrenzung Begrenzungs-Liste Weitere-Begrenzung Weitere-Begrenzung: & Interface-Typ Beispiel T extends S & Comparable 7

Typ-Argument: < Typ-Parameter-Liste > Typ-Parameter-Liste: Typ-Argument Typ-Parameter-Liste, Typ-Argument Typ-Argument: Referenz-Typ Wildcard Wildcard:?? Wildcard-Einschränkung Wildcard-Einschränkung: extends Referenz-Typ super Referenz-Typ Syntax für die Verwendung eines generischen Types Syntax Typ-Argument Beispiel <Vector, Integer,?,? super Comparable> 8

Beispiel Syntax package TypeVarMembers; class C { void mcdefault() { public void mcpublic() { private void mcprivate() { protected void mcprotected() { Something s fishy here interface I { void mi(); class CT extends C implements I {... generische Methode <T extends C & I> void test(t t) { t.mi(); t.mcdefault(); t.mcpublic(); t.mcprivate(); t.mcprotected(); 9

Ein genauerer Blick Was passiert in folgendem Codefragment? List<String> ls = new ArrayList<String>(); List<Object> lo = ls; ist nicht erlaubt, weil lo.add(new Object()); String s = ls.get(0); Sei A Oberklasse von B, das bedeutet nicht, dass L<A> Oberklasse von L<B> ist. Es handelt sich hier also nicht um eine,weiternde Umwandlung einer Referenz. 10

Weitere Beispiele Früher (< Java 1.5) void printcollection(collection c) { Iterator i = c.iterator(); while (i.hasnext()) { System.out.println(i.next()); Jetzt void printcollection(collection<object> c) { for (Object e : c) { System.out.println(e); Die neue Variante ist viel restriktiver als die alte, da sie nur Collections von Objects zulässt Was ist also ein Obertyp von L<T>? 11

Wie man es richtig macht Die Lösung sind so genannte Wildcards void printcollection(collection<?> c) { for (Object e : c) { System.out.println(e); Wildcards sind Obertypen von allen Typ-Argumenten. Sprechweise collection of unknown 12

Wildcards Auch bei Wildcards wird sichergestellt, dass nicht auf,falschen Typen operiert wird folgendes geht nicht Collection<?> c = new ArrayList<String>(); c.add(new Object()); 13

Wildcards II Aufgabe: eine Liste von Shapes zeichnen public abstract class Shape { public abstract void draw(canvas c); public class Circle extends Shape { private int x, y, radius; public void draw(canvas c) {... public class Rectangle extends Shape { private int x, y, width, height; public void draw(canvas c) {... public class Canvas { public void draw(shape s) { s.draw(this); public void drawall(list<shape> shapes) { for (Shape s: shapes) { s.draw(this); geht, ist aber unglücklich, warum? Kann nur auf eine List<Shape> aufgerufen werden! 14

Die Lösung: Wildcards mit Typ-Spezifizierung Wildcards II public void drawall(list<? extends Shape> shapes) { for (Shape s: shapes) { s.draw(this); aber folgendes geht wiederum nicht public void addrectangle(list<? extends Shape> shapes) { shapes.add(new Rectangle());? extends Shape muss kein Supertyp von Rectangle sein! 15

generische Methoden Auch Methoden können generisch sein static void fromarraytocollection(object[] a, Collection<?> c) { for (Object o : a) { c.add(o); So nicht, wissen wir schon static <T> void fromarraytocollection(t[] a, Collection<T> c) { for (T o : a) { c.add(o); Aber so! Der Typ des Arrays und der Collection sind nun gekoppelt 16

Beispiel generische Methoden static <T> void fromarraytocollection(t[] a, Collection<T> c) { for (T o : a) { c.add(o); Object[] oa = new Object[100]; Collection<Object> co = new ArrayList<Object>(); fromarraytocollection(oa, co); String[] sa = new String[100]; Collection<String> cs = new ArrayList<String>(); fromarraytocollection(sa, cs); fromarraytocollection(sa, co); Integer[] ia = new Integer[100]; Float[] fa = new Float[100]; Number[] na = new Number[100]; Collection<Number> cn = new ArrayList<Number>(); fromarraytocollection(ia, cn); fromarraytocollection(fa, cn); fromarraytocollection(na, cn); fromarraytocollection(na, co); Kann auf jede Collection angewendet werden, deren Typ-Parameter Supertyp des Typ- Parameters des Arrays ist fromarraytocollection(na, cs);!!! 17

und noch ein Beispiel class Pair<T, S> { T fst; S snd; Pair(T f, S s) {fst = f; snd = s; Wollen eine Methode in Seq, die zwei Collections paarweise zusammenfügt public class Seq<T> { T head; Seq<T> tail; Seq() { head = null; tail = null; [13, 42, 4711, 2011] [ Aa, Bb, Cc ] Seq(T head, Seq<T> tail) { this.head = head; this.tail = tail; boolean isempty() { return tail == null; [(13, Aa ), (42, Bb ), (4711, Cc )] 18

und noch ein Beispiel class Pair<T, S> { T fst; S snd; Pair(T f, S s) {fst = f; snd = s; public class Seq<T> { T head; Seq<T> tail; Seq() { head = null; tail = null; Seq(T head, Seq<T> tail) { this.head = head; this.tail = tail; boolean isempty() { return tail == null; Verwendung Lösung public <S> Seq<Pair<T,S>> zipit(seq<s> that) { if (isempty() that.isempty()) return new Seq<Pair<T,S>>(); else { return new Seq<Pair<T,S>>( new Pair<T,S>(head, that.head), tail.zipit(that.tail)); public static void main(string[] args) { Seq<Number> nums = new Seq<Number>(new Integer(1), new Seq<Number>(new Double(1.5), new Seq<Number>())); Seq<String> strs = new Seq<String>("Aa", new Seq<String>("Bb", new Seq<String>())); Seq<Pair<Number, String>> combined = nums.zipit(strs); 19

Besonderheiten: Arrays Java verbietet die Instanziierung (nicht die Definition) von Arrays von Typ-Variablen oder generischen Typen abgesehen von einem ungebundenen Wildcard! konkret: List<String>[] lsa = new List<String>[10]; ist nicht erlaubt 20

Besonderheiten: Arrays Angenommen, dies wäre möglich, dann List<String>[] lsa = new List<String>[10]; Object o = lsa; Object[] oa = (Object[]) o; List<Integer> li = new ArrayList<Integer>(); li.add(new Integer(3)); oa[1] = li; fishy, würde aber nicht erkannt werden String s = lsa[1].get(0); ClassCastException 21

Besonderheiten: Arrays ungebundene Wildcards in Arrays List<?>[] lsa = new List<?>[10]; erlaubt Object o = lsa; Object[] oa = (Object[]) o; List<Integer> li = new ArrayList<Integer>(); li.add(new Integer(3)); oa[1] = li; String s = (String) lsa[1].get(0); ClassCastException expliziter cast erzwungen 22