Polymorphie in Java oder Generics und Co.



Ähnliche Dokumente
Generische Typen in Java 1.5. Die Erweiterung der Java Language Specification

Neuere Sprachelemente in Java

Gebundene Typparameter

Java Einführung Collections

Java Einführung Abstrakte Klassen und Interfaces

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

Innere Klassen in Java

Java I Vorlesung Generics und Packages

C# im Vergleich zu Java

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

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

Generisches Programmieren. Generisches Programmieren

Objektorientierte Programmierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java: Vererbung. Teil 3: super()

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

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

Dynamische Typinformation A01 OOP. Dynamische Typinformation

Algorithmen und Datenstrukturen

Java Generics & Collections

Javakurs 2013 Objektorientierung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

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

Einführung in die Programmierung

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

Generische Datenstrukturen

1 Polymorphie (Vielgestaltigkeit)

12) Generische Datenstrukturen

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

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

Java 5 "Tiger" Erweiterungen

Objektorientierte Programmierung

12) Generische Datenstrukturen

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

Ich liebe Java && Ich liebe C# Rolf Borst

Der lokale und verteilte Fall

Bean-Mapping mit MapStruct

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

Javakurs zu Informatik I. Henning Heitkötter

Große Übung Praktische Informatik 1

Programmierkurs Java

Client-Server-Beziehungen

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

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

Generische Typen in Java

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

Prinzipien Objektorientierter Programmierung

Remote Method Invocation

Programmieren in Java

SEP 114. Design by Contract

II.4.4 Exceptions - 1 -

Typumwandlungen bei Referenztypen

Einführung in die Java- Programmierung

Arten des universellen Polymorphismus

Aufgabenblatt Nr. 5 Generizität und TicTacToe

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

Struts 2 Das Imperium schlägt zurück?

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

Factory Method (Virtual Constructor)

Java Kurs für Anfänger Einheit 5 Methoden

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

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

Programmieren in Java

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Kapitel 6. Vererbung

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

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

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

Programmieren 2 16 Java Collections und Generizität

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

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

Objektorientierte Programmierung

Programmierkurs Java

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

Software Engineering Klassendiagramme Assoziationen

Beispiel: DB-Mock (1/7)

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

C O C O O N. Wo ist Cocoon in die Apache Projekte einzureihen?

Einführung in die Programmierung für Wirtschaftsinformatik

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

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Transkript:

public static <T extends Object & Comparable<? super T>> T max(collection<? extends T> coll) /** Add an element t to a Set s */ public static <T> void addtoset(set<t> s, T t) {... Polymorphie in Java oder Generics und Co. Ein Vortrag über Neuerungen in Java 1.5 von Stanley Rost TreeSet(Comparator<? super E> c) Gliederung Was sind Generics? Java Collections Framework Entwicklung der Generics Tutorial Integration Weitere Neuerungen in Java 1.5

Was bedeutet Generics? Generisch? Generation? Genmanipuliert? Bedeutung ge!ner!ic [ d!ı'nerık] adj: ~ term (od. name) biol. Gattungsname m; allg. Oberbegriff m. In Java: Abstraktion über Typen Typsicherheit z.b. im Collections Framework

Einsatz von Generics Container-Typen List myintlist = new LinkedList() myintlist.add(new Integer(0)); Integer x = (Integer) myintlist.iterator().next(); List<Integer> myintlist = new LinkedList<Integer>(); myintlist.add(0); Integer x = myintlist.iterator().next(); Das Collections- Framework Ein Überblick

Historie der Generics 1848 1857 1899 1912-26

Historie der Generics Mai 1999 JSR Approval (Java Specification Request) September 2000 Community Review Mai - August 2001 Public Review als Basis GJ (Pizza), PolyJ (MIT) Gilad Bracha, Sun Microsystems Inc. Tutorial public static <T extends Object & Comparable<? super T>> T max(collection<? extends T> coll)

Simple Generics public interface List<E> { void add(e x); Iterator<E> iterator(); public interface Iterator<E> { E next(); boolean hasnext(); E = formaler Typparameter List<Integer> l = new ArrayList<Integer>(); Subtypen List<String> ls = new ArrayList<String>(); List<Object> lo = ls; Fehler lo.add(new Object()); String s = ls.get(0);

Wildcards (1) void printcollection(collection c) { Iterator i = c.iterator(); for (k = 0; k < c.size(); k++) { System.out.println(i.next()); void printcollection(collection<object> c) { for (Object e : c) { System.out.println(e); Wildcards (2) void printcollection(collection<?> c) { for (Object e : c) { System.out.println(e); Collection<?> c = new ArrayList<String>(); c.add(new Object()); // compile time error Fehler

Bounded Wildcards (1) 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); public void drawall(list<? extends Shape> shapes) {... Bounded Wildcards (2) public void addrectangle(list<? extends Shape> shapes) { shapes.add(0, new Rectangle()); Fehler

Generic Methods (1) static void fromarraytocollection(object[] a, Collection<?> c) { for (Object o : a) { c.add(o); // compile time error Fehler static <T> void fromarraytocollection(t[] a, Collection<T> c) { for (T o : a) { c.add(o); // correct Universelle Methode! Generic Methods (2) Generische Methoden oder Wildcards? class Collections { public static <T> void copy(list<t> dest, List<? extends T> src) {... class Collections { public static <T, S extends T> void copy(list<t> dest, List<S> src) {...

Legacy Code void abc(collection c) {... // raw type abc(new Collection<String>()); // unchecked warning void abc(collection<string> c) { for(string s: c) {... abc(new Collection()); // unchecked warning Aufruf von legacy code aus generic code unsicher! Integration

Integration Collection Framework 100% java.lang.class<t> Typ von String.class = Class<String>, Typ von Serilizable.class = Class<Serializable> Verbessert Typsicherheit in Reflection Class.newInstance() gibt jetzt den aktuellen Typ zurück (Factory-Methoden) Integration Erfahrungsbericht new javax.swing.table.tablemodel(vector data, Vector columnnames); new javax.swing.table.tablemodel(object[][] data, Object[] columnnames); new javax.swing.table.tablemodel(list<list<?> data, List<?> columnnames); Map<String, Integer> typepool = new HashMap<String, Integer>(); Integer typecount = typepool.get(classname); // int typecount = typepool.get(classname); typecount++; Fazit: Man hätte es vorher genauso programmieren können, nur waren an einigen Stellen Arrays praktischer, weil typsicher und ich hatte viel java.util.vektor benutzt.

Erasure (1) public String loophole(integer x) { List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // compile-time unchecked warning return ys.iterator().next(); zur Laufzeit: public String loophole(integer x) { List ys = new LinkedList(); List xs = ys; Fehler xs.add(x); return (String) ys.iterator().next(); // run time error ClassCastException Erasure (2) Löscht alle generischen Typinformationen Z.B. Eine parametrisierte List<String> wird List Alle verbleibenden Auftreten von Typvariablen werden durch ihre upper bound ersetzt (normalerweise Object) Einfügen von Casts an den entsprechenden Stellen

Zur Laufzeit List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getclass()); true!!! Alle Instancen einer generischen Klasse haben dieselbe Runtime-Klasse Generisch heißt: Die Klasse verhält sich für alle Parameter-Typen gleich Casts Collection cs = new ArrayList<String>(); if (cs instanceof Collection<String>)...// illegal Collection<String> cstr = (Collection<String>) cs; // unchecked warning <T> T badcast(t t, Object o) { return (T) o; // unchecked warning Arrays können nicht parametrisiert werden (außer durch unbounded wildcards )

Zusammenfassung Typ-Variablen existieren zur Laufzeit nicht! Das bedeutet: Kein Performance Overhead Aber: Keine typsicheren Casts If your entire application has been compiled without unchecked warnings using javac -source 1.5, it is type safe. Generics & Co Autoboxing, Neue for-schleife, Typsichere Enumerationen, Varargs, Statische Importe, Annotations

Autoboxing Wrapper für primitive Typen werden automatisch eingesetzt. List<Integer> list = new ArrayList<Integer>(); list.add(1); int i = list.iterator().next(); Integer i1 = new Integer(5); int i2 = 8; int i3 = ++i1 + i2; Erweiterte for Schleife void cancelall(collection c) { for(iterator i = c.iterator(); i.hasnext();) { TimerTask tt = (TimerTask) i.next(); tt.cancel(); void cancelall(collection<timertask> c) { for(timertask tt: c) { tt.cancel(); Funktioniert auch mit Arrays und verschachtelten Iterationen

Typsichere Enumerationen enum Farbe {EICHEL, GRUEN, HERZ, SHELL enum Wert {SIEBEN, ACHT, NEUN, ZEHN< BUBE, DAME, KOENIG, ASS List<Card> spiel = new ArrayList<Card>(); for(farbe farbe: Farbe.values()) for(wert wert: Wert.values()) spiel.add(new Card(farbe, wert)); Collections.shuffle(spiel); Würde ohne Java 1.5 mehrere Seiten Code benötigen!!! Varargs public static String format(string pattern, Object... arguments) String result = MessageFormat.format( At {1, time on {1,date, there was {2 on planet + {0,number,integer., 7, new Date(), a disturbance in the Force ); Parametertyp von arguments ist Object[] Aufrufer muß neue Syntax nicht benutzen

Statische Importe Nützlich z.b. für mathematische Klassen import static java.lang.math.*;... double x = sin(pi / 2); Annotations (1) Metadata Beispiel JAX-RPC Web Service public interface CoffeeOrderIF extends java.rmi.remote { public Coffee[] getpricelist() throws java.rmi.remoteexception; public String ordercoffee(string name, int quantity) throws java.rmi.remoteexception; public Class CoffeeOrderImpl implements CoffeeOrderIF { public Coffee[] getpricelist()... public String ordercoffee(string name, int quantity)...

Annotations (2) Metadata mit Metadaten import java.xml.rpc.*; public Class CoffeeOrder { @Remote public Coffee[] getpricelist() {... @Remote public String ordercoffee(string name, int quantity) {... Other Stuff (noch) keine RawSockets noch keine Isolation API, aber Class Sharing (wie unter Mac OS X) Java Management Extensions Bessere Unterstützung für Multithreading XML, OpenGL, LDAP,...

Zusammenfassung Zusammenfassung Generics, Erweiterte for-schleife, Enumerationen, Autoboxing Typsicherheit, schöner Code relativ schnelles Einlernen (Anwendung) Binärkompatibilität ist gewährleistet Zur Zeit keine IDE-Unterstützung

Quellen htpp://java.sun.com Gilad Bracha: Generics Tutorial Latest JSR14 draft specification Gilad Bracha: Adding Generics to the Java Programming Language, Slides from JavaOne 2003 presentation ix 03/2004: Der Tiger ist los