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



Ähnliche Dokumente
Gebundene Typparameter

Dynamische Typinformation A01 OOP. Dynamische Typinformation

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

Arten des universellen Polymorphismus

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

1 Polymorphie (Vielgestaltigkeit)

Typumwandlungen bei Referenztypen

Einführung in die Programmierung

Java Einführung Collections

Java: Vererbung. Teil 3: super()

Prinzipien Objektorientierter Programmierung

Polymorphie in Java oder Generics und Co.

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

Objektorientierte Programmierung

Objektorientierte Programmierung

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

Javakurs zu Informatik I. Henning Heitkötter

Einführung in die Programmierung für Wirtschaftsinformatik

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

C# im Vergleich zu Java

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

Programmieren in Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java Einführung Abstrakte Klassen und Interfaces

2.4.3 Polymorphie (Wiederholung von Alp2)

Große Übung Praktische Informatik 1

Objektorientierte Programmierung

Generische Datenstrukturen

Programmieren in Java

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

Algorithmen und Datenstrukturen

12) Generische Datenstrukturen

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

Programmieren 2 16 Java Collections und Generizität

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

Nathan Burgener. Design by Contract. Modul SWE

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

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Klausur zur Einführung in die objektorientierte Programmierung mit Java

II.4.4 Exceptions - 1 -

Innere Klassen in Java

Kapitel 6. Vererbung

Generisches Programmieren. Generisches Programmieren

Java-Schulung Grundlagen

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

Java Virtual Machine (JVM) Bytecode

Aufgabenblatt Nr. 5 Generizität und TicTacToe

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

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Pragmatik von Programmiersprachen

Neuere Sprachelemente in Java

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

Programmieren in Java

Java Kurs für Anfänger Einheit 5 Methoden

Fortgeschrittene Programmierung

Kapitel 6. Vererbung

Vererbung & Schnittstellen in C#

Programmierkurs Java

Assoziation und Aggregation

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Vorkurs C++ Programmierung

Client-Server-Beziehungen

12) Generische Datenstrukturen

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

Kapitel 6. Vererbung

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

Java - Programmierung - Objektorientierte Programmierung 1

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Interfaces und Generics

Einführung in die Java- Programmierung

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

Java Generics & Collections

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

Vorkurs Informatik WiSe 15/16

II.4.5 Generische Datentypen - 1 -

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

Factory Method (Virtual Constructor)

Software Engineering Klassendiagramme Einführung

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

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Programmieren 2 Java Überblick

WebService in Java SE und EE

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

Transkript:

Generische Typen in Java 1.5 - Seminarvortrag 1/26 Generische Typen in Java 1.5 Die Erweiterung der Java Language Specification Seminarvortrag von Heiko Minning, mi3795 bei Prof. Dr. Uwe Schmidt, FH-Wedel Wintersemester 2002/2003

Generische Typen in Java 1.5 - Seminarvortrag 2/26 Definition: Generizität => parametrisierung mit Typen => (Referenz-)Typen als Parameter => zusätzliche Abstraktionsebene (kein OO Konzept!) => allgemeingültiger Code (Wiederverwendung) => Typsicherheit

Generische Typen in Java 1.5 - Seminarvortrag 3/26 Problem LinkedList list = new LinkedList(); list.add(new Byte((byte)0)); Byte x = (Byte) list.get(0); LinkedList listlist = new LinkedList(); listlist.add(list); Byte z = (Byte) ((LinkedList)listlist.get(0)).get(0); String s = (String) list.get(0); // ClassCastException Lösung? Wrapper-Klassen ( StringList ) Generizität schlecht gut!

Generische Typen in Java 1.5 - Seminarvortrag 4/26 Mit Java 1.5 (generische Klassen) LinkedList<Byte> list = new LinkedList<Byte>(); list.add(new Byte((byte)0)); Byte x = list.get(0); LinkedList<LinkedList<Byte>> listlist = new LinkedList<LinkedList<Byte>>(); listlist.add(list); Byte z = listlist.get(0).get(0); String s = list.get(0); // Fehler zur Compile-Zeit! /* Ausgabe des Compilers: * incompatible types * found : java.lang.byte * required: java.lang.string * String s = list.get(0) * ^ */

Generische Typen in Java 1.5 - Seminarvortrag 5/26 Die andere Seite interface Collection { public void add(object x); public Object get(int index); class LinkedList implements Collection { private Object head; private LinkedList next; public void add(object x){ /*...*/ public Object get(int index){ /*...*/ return null;

Generische Typen in Java 1.5 - Seminarvortrag 6/26 in Java 1.5 interface Collection<A> { public void add(a x); public A get(int index); class LinkedList<A> implements Collection<A> { private A head; private LinkedList<A> next; public void add(a x){ /*...*/ public A get(int index){ /*...*/ return null;

Generische Typen in Java 1.5 - Seminarvortrag 7/26 Generische Methoden: (zunächst 1.4.1 Code) interface Comparator { public int compare(object x, Object y); class ByteComparator implements Comparator { public int compare(object x, Object y){ return ((Byte)x).byteValue() - ((Byte)y).byteValue(); class CollectionOp { public static Object max(collection xs, Comparator c){ Iterator xi = xs.iterator(); Object w = xi.next(); while(xi.hasnext()){ Object x = xi.next(); if(c.compare(w,x) < 0) w = x; return w;

Generische Typen in Java 1.5 - Seminarvortrag 8/26 Das dazugehörige Testprogramm class Test { public static void main(string[] args){ LinkedList xs = new LinkedList(); xs.add(new Byte((byte)0)); xs.add(new Byte((byte)1)); Byte x = (Byte) CollectionOp.max(xs, new ByteComparator()); LinkedList ys = new LinkedList(); ys.add("zero"); ys.add("one"); String y = (String) CollectionOp.max(ys, new ByteComparator()); // ClassCastException

Generische Typen in Java 1.5 - Seminarvortrag 9/26 Generische Methoden in Java 1.5 interface Comparator<A> { public int compare(a x, A y); class ByteComparator implements Comparator<Byte> { public int compare(byte x, Byte y){ return x.bytevalue() - y.bytevalue(); class CollectionOp { public static <A> A max(collection<a> xs, Comparator<A> c){ Iterator<A> xi = xs.iterator(); A w = xi.next(); while(xi.hasnext()){ A x = xi.next(); if(c.compare(w,x) < 0) w = x; return w;

Generische Typen in Java 1.5 - Seminarvortrag 10/26 Das dazugehörige Testprogramm class Test { public static void main(string[] args){ LinkedList<Byte> xs = new LinkedList<Byte>(); xs.add(new Byte((byte)0)); xs.add(new Byte((byte)1)); Byte x = CollectionOp.max(xs, new ByteComparator()); LinkedList<String> ys = new LinkedList<String>(); ys.add("zero"); ys.add("one"); String y = CollectionOp.max(ys, new ByteComparator()); // compile-fehler! /* Ausgabe des Compilers: * max<a>(java.util.collection<a>,comparator<a>) in CollectionOp cannot be applied to * (java.util.linkedlist<java.lang.string>,bytecomparator) */ Gut, aber: Wie wird <A> in CollectionOp.max(...) bestimmt? => Typ-Inferenz

Generische Typen in Java 1.5 - Seminarvortrag 11/26 Bestimmung der Typen interface I { interface J { interface K extends I { interface L extends I, J { class X { public static void test(k k, L l){ I i = choose(k,l); public static <A> A choose(a x, A y){ return (x.hash() < y.hash())? x : y; I J K L

Generische Typen in Java 1.5 - Seminarvortrag 12/26 Und wenn es keine Parameter gibt? public static <A> A get(){... public static <A> LinkedList<A> get2(){... => Null-Typ (*) => Typ der Konstanten null (*) => Subtyp aller Referenz-Typen Beispiele: * ist Subtyp von Integer LinkedList<*> ist Subtyp von LinkedList<String> Pair<Byte,*> ist Subtyp von Pair<Byte, Byte> Beachte: Linearitätsbeschränkung! Sonst: Umgehung des Typsystems

Generische Typen in Java 1.5 - Seminarvortrag 13/26 Beispiel für mögliche Typverletzung class Cell<A> { public A value; public Cell (A v) { value = v; public static <B> Cell<B> allocate (B x) { return new Cell<B>(x); class Pair<A,B> { public A fst; public B snd; public Pair (A x, B y) { fst = x; snd = y; public static <C> Pair<C,C> duplicate (C x) { return new Pair<C,C>(x,x); class Loophole { public static String loophole (Byte y) { Pair<Cell<String>,Cell<Byte>> p = Pair.duplicate(Cell.allocate(null)); // compile-time error p.snd.value = y; return p.fst.value; public static String permitted (String x) { Pair<Cell<String>,Cell<String>> p = Pair.duplicate(Cell.allocate((String)null)); p.fst.value = x; return p.snd.value;

Generische Typen in Java 1.5 - Seminarvortrag 14/26 Beschränkte Typparameter class CollectionOp { public static Comparable max(collection xs){ Iterator xi = xs.iterator(); Comparable w = (Comparable) xi.next(); while(xi.hasnext()){ Comparable x = (Comparable) xi.next(); if(w.compareto(x) < 0) w = x; return w; => als generischer Code?

Generische Typen in Java 1.5 - Seminarvortrag 15/26 Umsetzung mit Generizität class CollectionOp { public static <A extends Comparable<A>> A max(collection<a> xs){ Iterator<A> xi = xs.iterator(); A w = xi.next(); while(xi.hasnext()){ A x = xi.next(); if(w.compareto(x) < 0) w = x; return w; weitere Beschränkungen möglich: <A extends Number & Comparable<A> & Clonable>

Generische Typen in Java 1.5 - Seminarvortrag 16/26 die Übersetzung => Typlöschung (homogen) => Vector<A> wird zu Vector => A extends Comparable<A> wird zu Comparable => A wird zu Object => einfügen von sicheren Casts => Code häufig identisch zu Object -Programmierung => keine Typinformation zur Laufzeit => gleiche Performance => keine Änderung an ByteCode oder JVM => vollständige Kompatibilität

Generische Typen in Java 1.5 - Seminarvortrag 17/26 RawType parametrisierte Typen ohne Parameter Vector ist der RawType von Vector<String> Zuweisung an RawType immer möglich => bei Benutzung evtl. unchecked warnung Umgekehrte Zuweisung: unchecked warnung class Loophole { public static String loophole (Byte y) { LinkedList<String> xs = new LinkedList<String>(); LinkedList ys = xs; ys.add(y); // unchecked warnung return xs.get(0); // ClassCastException

Generische Typen in Java 1.5 - Seminarvortrag 18/26 Zwei Fälle von unchecked warnung class Testit<A>{ public A v; public void set(a v){ this.v=v; public class Test{ public static void main(string[] args){ Testit t = new Testit(); // oder auch = new Testit<Boolean>() t.v = Boolean.TRUE; t.set(boolean.true); /* Ausgabe des Compilers: * Test.java:9: warning: unchecked assignment to variable v of raw type * class Testit * t.v = Boolean.TRUE; * ^ * Test.java:10: warning: unchecked call to set(a) as a member of the raw * type Testit * t.set(boolean.true); * ^ * 2 warnings */

Generische Typen in Java 1.5 - Seminarvortrag 19/26 Das Problem mit der Vererbung interface Comparator<A> { public int compare(a x, A y); class ByteComparator implements Comparator<Byte> { public int compare(byte x, Byte y){ return x.bytevalue() - y.bytevalue(); Übersetzt zu class ByteComparator implements Comparator { public int compare(byte x, Byte y){ return x.bytevalue() - y.bytevalue(); public int compare(object x, Object y){ return this.compare((byte) x, (Byte) y);

Generische Typen in Java 1.5 - Seminarvortrag 20/26 Brücken mit gleicher Signatur interface Iterator<A> { public boolean hasnext(); public A next(); class Interval implements Iterator<Integer> { private int i; private int n; public Interval(int l, int u) { i = l; n = u; public boolean hasnext() { return (i <= n); public Integer next() { return new Integer(i++); Übersetzt zu... class Interval implements Iterator { private int i; private int n; public Interval(int l, int u) { i = l; n = u; public boolean hasnext() { return (i <= n); public /*1*/ Integer next() { return new Integer(i++); // bridge public /*2*/ Object next() { return /*1*/ next();

Generische Typen in Java 1.5 - Seminarvortrag 21/26 Covariante Rückgabe bei Methoden (optional) class C implements Cloneable { public C copy() { return (C)this.clone(); class D extends C { public D copy() { return (D)this.clone(); // in Java 1.4.1 illegal! Die Übersetzung: class D extends C { public /*1*/ D copy() { return (D)this.clone(); // bridge public /*2*/ C copy() { return /*1*/ this.copy();

Generische Typen in Java 1.5 - Seminarvortrag 22/26 Arrays class BadArray { public static <A> A[] singleton (A x) { return new A[]{ x ; // unchecked warning public static void main (String[] args) { String[] a = singleton("zero"); // run-time exception

Generische Typen in Java 1.5 - Seminarvortrag 23/26 Ableitung parametrischer Typen ist invariant Beispiel Vector<String> ist kein Subtyp von Vector<Object> Covariante Ableitung würde Typsystem umgehen class Loophole { public static String loophole (Byte y) { LinkedList<String> xs = new LinkedList<String>(); LinkedList<Object> ys = xs; // compile-time error incompatible types ys.add(y); // mögliche Typverletzung return xs.get(0); Aber Collection<String> c = new LinkedList<String>(); // ist ok!

Generische Typen in Java 1.5 - Seminarvortrag 24/26 Casts von parametrischen Typen (optional) Legal: class Convert { public static <A> Collection<A> up (LinkedList<A> xs) { return (Collection<A>)xs; public static <A> LinkedList<A> down (Collection<A> xs) { if (xs instanceof LinkedList<A>) return (LinkedList<A>)xs; else throw new ConvertException(); Illegal: class BadConvert { public static Object up (LinkedList<String> xs) { return (LinkedList<Object>) xs; // compile-time error public static LinkedList<String> down (Object o) { if (o instanceof LinkedList<String>) // compile-time error return (LinkedList<String>)o; // compile-time error else throw new ConvertException();

Generische Typen in Java 1.5 - Seminarvortrag 25/26 Zusammenfassung generische, optional beschränkte Typen wechselseitige Rekusion möglich polymorphe Klassen und Methoden covariante Methodenüberschreibung für Rückgabeparameter invariante Ableitung von parametrisierten Typen homogene Übersetzung mit Brückenmethoden, und Typlöschung keine generische Laufzeitinformation rückwartskompatibel und vorwärtskompatibel keine Änderung an ByteCode oder JVM es bleiben viele Unklarheiten offen (Spezifikation ist noch nicht fertig!)

Generische Typen in Java 1.5 - Seminarvortrag 26/26 Quellen: Bracha, Gilad et al.: Adding Generics to the Java Programming Language: Participant Draft Specification April 2001: http://jcp.org/aboutjava/communityprocess/review/jsr014/index.html Bracha, Gilad et al.: Making the future safe for the past: Adding Genericity to the java programming language, OOPSLA 1998: http://www.research.avayalabs.com/user/wadler/pizza/gj/documents/gj-oopsla.pdf Bracha, Gilad et al.: GJ: Extending the Java Programming language with type parameters, http://www.research.avayalabs.com/user/wadler/pizza/gj/documents/gj-tutorial.pdf weitere Quellen: siehe Ausarbeitung