Java 5 "Tiger" Erweiterungen



Ähnliche Dokumente
Java 5 "Tiger" Erweiterungen

Objektorientierte Programmierung. Kapitel 12: Interfaces

Neuere Sprachelemente in Java

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

Java Einführung Collections

Probleme ohne generische Typen

Einführung in die Java- Programmierung

Generische Datenstrukturen

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

Prinzipien Objektorientierter Programmierung

Programmierkurs Java

Gebundene Typparameter

Objektorientierte Programmierung

Polymorphie in Java oder Generics und Co.

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

Java Einführung Abstrakte Klassen und Interfaces

12) Generische Datenstrukturen

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

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

12) Generische Datenstrukturen

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

Einführung in die Programmierung

Studentische Lösung zum Übungsblatt Nr. 7

Programmierkurs Java

Java: Vererbung. Teil 3: super()

Objektorientierte Programmierung

Vorlesung Inf-B

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

Programmieren in Java

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

Java Generics & Collections

Übung 9 - Lösungsvorschlag

13. Tutorium zu Programmieren

1 Polymorphie (Vielgestaltigkeit)

Typumwandlungen bei Referenztypen

Javakurs zu Informatik I. Henning Heitkötter

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

5. Tutorium zu Programmieren

Folge 18 - Vererbung

Kapitel 6. Vererbung

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Software Engineering Klassendiagramme Assoziationen

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

5. Abstrakte Klassen

Innere Klassen in Java

Aufgabenblatt Nr. 5 Generizität und TicTacToe

U08 Entwurfsmuster (II)

Kapitel 6. Vererbung

Vorlesung Informatik 2

1 Vom Problem zum Programm

Javakurs 2013 Objektorientierung

Besonderheiten von C#

Wiederholung aus SWE2

Factory Method (Virtual Constructor)

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Der lokale und verteilte Fall

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel

5.2 Neue Projekte erstellen

GetName(), GetName(), GetGeschlecht() und AelterWerden().

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

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Die Post hat eine Umfrage gemacht

Was meinen die Leute eigentlich mit: Grexit?

Liste Programmieren Java Überblick

1 Einleitung Generizität Syntax... 2

Kapitel 6. Vererbung

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

Einführung in die Java- Programmierung

Vererbung & Schnittstellen in C#

Testen mit JUnit. Motivation

Algorithmen und Datenstrukturen

Tutorium Informatik 1. Aufgabe 2: Formatierte Ein- und Ausgabe

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

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Java Kurs für Anfänger Einheit 5 Methoden

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

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

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

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

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

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

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

Grundbegriffe der Informatik

Klausur zur Einführung in die objektorientierte Programmierung mit Java

2. Programmierung in C

der Eingabe! Haben Sie das Ergebnis? Auf diesen schwarzen Punkt kommen wir noch zu sprechen.

Client-Server-Beziehungen

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

Grundlagen von Python

.NET Code schützen. Projekt.NET. Version 1.0

Distributed Computing Group

Access und die andern (Office) Programme. Armin Hess

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

C# im Vergleich zu Java

Übungen Programmieren 1 Felix Rohrer. Übungen

Transkript:

Java 5 "Tiger" Erweiterungen Autoboxing und Unboxing Erweiterte for-schleife Variable Anzahl Methoden-Argumente und printf Enumerationen Statische Imports Generics Annotationen (hier nicht behandelt)

Java 5, 6, 7, 8 Erste Java (1992) Spracherweiterung im Jahr 2004 Erweiterungen wurden so vorgenommen, dass bestehende Programme weiter funktionieren Aber: im JDK z.t. jetzt neue und alte Variante ("deprecated") nebeneinander vorhanden Java 6 keine Spracherweiterungen Java 7 nur kleine Verfeinerungen bez. Sprache (z.b. case mit Strings); JDK: parallele Verarbeitung à la Thread Pool (+ java.util.concurrent) Java 8 Lambda Ausdrücke und Stream Bibliothek JDK: parallele Verarbeitung à la Map-Reduce (+ java.util.streams) 2 von 51

Verschiedene neue Konzepte 3 von 51

Autoboxing und Unboxing Sehr oft Umwandlung von Wertetyp in Referenztyp und zurück: int<-> Integer vereinfacht, automatisiert Integer i = new Integer(5656); int j = i.intvalue(); Integer i = 5656; int j = i; Object o = new Integer(4711); int y = (Integer)o.intValue(); Object o = 4711; int y = (Integer)o; void setvalue(object o){ p.setvalue(new Integer(34)); void setvalue(object o) { p.setvalue(43); 4 von 51

Foreach-Scheife Sehr oft Iteration durch alle Elemente einer Collection, Arrays (in aufsteigender Reihenfolge) int[] a = {1,2,4; int sum=0; for (int i = 0; i < a.length; i++) { sum+=i; int[] a = {1,2,4; int sum=0; for (int i : a) { sum +=i; List numbers = new ArrayList(a); // numbers is a list of Numbers. Iterator it = numbers.iterator(); while (it.hasnext() ) { Integer number = (Integer) it.next(); // Do something with the number... List numbers = new ArrayList(a); for (int n : numbers) { // Do something with the number... 5 von 51

Enumerationen Typen, deren Wertebereich einer endlichen, kleinen Menge von Werten entspricht bisher als int oder static "Object"-Konstante) public class Color { public static int Red = 1; public static int White = 2; public static int Blue = 3; int mycolor = Color.Red; int mycolor = 999; // no compile time error!!! oder: public class Color { public static Color Red = new Color(255,0,0); Color c = Color.Red; 6 von 51

Enumerationen // The color enumeration public enum Color { Red, White, Blue Color c = Color.Red; // Cycling through the values of an enumeration // (static method values() for (Color c : Color.values()) {System.out.println(c); Output: Red White Blue 7 von 51

Variable Methoden Argumente und printf // An example method that takes a // variable number of parameters // An example method that takes a // variable number of parameters // Old int sum(int[] numbers){ int mysum = 0; for (int i=0; i<numbers.length; i++) mysum += numbers[i].; return mysum; // New int sum (int... numbers) { int mysum = 0; for (int i: numbers) mysum += i; return mysum; // Code fragment that calls the // sum method sum(12,13,20); // Code fragment that calls // the sum method sum(new int[] {12,13,20); 8 von 51

Variable Methoden Arguments und printf Es gibt neu eine printf Methode in System.out für die formatierte Ausgabe Erster String definiert ein Template mit Platzhaltern %d,%i -> Integer %f ->Float %s ->String %n -> New Line // Pre Java 5 print statement System.out.println(x + " + " + y + " = " + sum); // Using Java 5 printf statement System.out.printf("%d + %d = %d%n", x, y, sum); http://alvinalexander.com/programming/printf-format-cheat-sheet 9 von 51

Static Imports // x is a number of type double such as 5.345 double y = Math.sin(x); With static imports in Java 5, you can ask the Java compiler to import only a class's static portions, as shown, for example, in the rewritten code fragment below: // Import declaration along with the other imports import static java.lang.math.sin; // And then somewhere in the code... // "floating functions" arise from the ashes!! double y = sin(x); // Import all static methods from Math import static java.lang.math.*; 10 von 51

Java Generics 11 von 51

Java Generics im Collection-Framework Bisher: List list = new LinkedList(); list.add(new Integer(99)); list.add(new String("a")); Integer i = (Integer)list.get(1); -->Runtime-Error Gefährlich: kein Schutz gegen Einfügen von Elementen vom "falschen" Typ ClassCastException zur Laufzeit möglich bei falschem Typcast Lösung: try-catch, Befüllung der List absichern oder sonstige Klimmzüge Wünschenswert: Collection Klassen spezialisiert auf bestimmte Elementtypen 12 von 51

Java Generics im Collection-Framework Java 5 List<Integer> list = new LinkedList<Integer>(); list.add(new Integer(99)); // oder dank Boxing: list.add(99); Integer i = list.get(0); // oder dank Unboxing: int i = list.get(0); list.add(new Double(3.1415)); -->Compile-Error Vorüberlegung über den Datentyp, den die Collection aufnehmen soll. Hier: Der Typparameter ist vom Typ Integer. erhöht die Aussagekraft und erleichtert Verständnis des Codes Einfügen von anderen Typen werden zur Compile-Zeit schon abgelehnt Cast beim Lesen kann entfallen, da garantiert keine anderen Typen enthalten sind. 13 von 51

Java Generics im Collection-Framework List<Integer> list = new LinkedList<Integer>(); list.add(99); Generischer Datentypen, List<Integer>, LinkedList<Integer> Duden: Generisch = "Die Gattung betreffend", "Gattungs..." Man sieht auch "parametrisierter Datentyp" oder "parametrischer Datentyp" Regeln sind sehr restriktiv, z.b. list.add(new Object()); ergibt Compile-Error Boxing wird unterstützt, d.h. int <-> Integer 14 von 51

Java Generics - Vorteile Erweiterung des Java 5 Collection Frameworks erhöht die Effizienz von Collections, macht sie vielseitiger einsetzbar macht deren Einsatz komfortabler, sicherer und aussagekräftiger senkt die Gefahr von Fehlern bei Typprüfungen zur Laufzeit Erleichtert so die Implementierung von Datenstrukturen wie Containern Möglichkeit zur Erstellung von eigenen Klassenschablonen und Methodenschablonen Erleichtert das Schreiben von Algorithmen, die mit verschiedenen Datentypen funktionieren. 15 von 51

Entwicklung von generischen Klassen 16 von 51

Generizität Datentypen wurden in die Programmiersprachen eingeführt, um die Anwendung von Programmiersprachen sicherer zu machen. Assembler und frühe C Versionen kannten keine Datentypen-> oft Quelle von Fehlern Mit dem Datentyp wird die Menge der Operationen (Operatoren), die auf Werte dieses D.T. angewandt werden können, eingeschränkt (constraint). z.b. 6 * 8 aber nicht "hallo" * "world" oder int i = "hallo" Es soll aber trotzdem möglich sein, eine Datenstruktur / einen Algorithmus auf Werte verschiedener Datentypen anzuwenden z.b. Datenstrukturen: Liste, Stack, Queue z.b. Algorithmen: Sortieren Einen Algorithmus, der auf Werte von unterschiedlichen Datentypen angewandt werden kann, nennt man generisch. 17 von 51

Generizität bisher (bis Java 1.4) Generizität erreicht durch: 1) überladen von Methoden int max(int i, int j); double max(double d, double e); 2) Object als Parameter (als Oberklasse aller Klassen) class Box { private Object val; void setvalue(object val ) { this.val = val; Object getvalue() { return val; intbox.setvalue(new Integer(32)); int i = (Integer)intBox.getValue(); Java ist auch eine Insel Christian Ullenboom beim Lesen muss ein Cast zum gewünschten Typ durchgeführt werden Es können Werte von beliebigen D.T. eingefügt werden obwohl das u.u. keinen Sinn macht: Laufzeitfehler beim Lesen (TypeCastException) 18 von 51

Generizität bisher (bis Java 1.4) 3) für jeden Datentyp eine eigene Klasse Container für eine einfache Zahl (Datentyp int) class IntBox { private int val; void setvalue( int val ) { this.val = val; int getvalue() { return val; Das Gleiche für String, Integer, Float, Double etc. class StringBox { private String val; void setvalue(string val ) { this.val = val; String getvalue() { return val; Java ist auch eine Insel Christian Ullenboom 19 von 51

Generische Klassen (ab Java 5) für den Typ wird lediglich ein Platzhalter, z.b. T, E, V eingesetzt der Typ kann später bei der Instanzierung (Variablendeklaration) festgelegt werden: Konkretisierung des Typs class Box<T> { private T val; Platzhalter Platzhalter durch durch < < > > gekennzeichnet gekennzeichnet void setvalue(t val ) { this.val = val; T getvalue() { return val; Java ist auch eine Insel Christian Ullenboom Deklarationen: Box<String> box = new Box<String>(); Box<Integer> box = new Box<Integer>(); Box<Point> box = new Box<Point>(); Bei Bei der der Instanzierung Instanzierung wird wird der der Typ Typ konkretisiert konkretisiert Einschränkung: für T nur Referenztypen erlaubt, keine einfachen Datentypen 20 von 51

Verwendung von generischen Typen Es sind keine Typenumwandlungen (Casts) notwendig Fehler werden während der Übersetzung erkannt. Box<String> box = new Box<String)(); box.setvalue("hallo"); String x = box.getvalue(); Konkretiriserung dss Konkretiriserung dss Platzhaltertyp s Platzhaltertyp s funktioniert auch mit einfachen Typen dank Boxing Box<Integer> box = new Box<Integer>(); box.setvalue(42); int x = box.getvalue(); box.setvalue("hallo"); // Compiler Fehler automatisches automatisches Boxing Boxing 21 von 51

Generische Methoden 22 von 51

Methoden mit Typparameter "<T>" "<T>" vor vor dem dem Rückgabetyp Rückgabetyp static <T> void foo(t arg) { foo(4); Der konkrete Typ muss nicht angegeben sondern wird anhand der Parameter hergeleitet (Type Infererence) static <T> T foo(t t) { return t; int i = foo(4); int i = foo(4.3); --> Compile-Error Generische Methoden können auch in nicht-generischen Klassen verwendet werden. 23 von 51

Subtyping von generischen Klassen 24 von 51

Erben bei generischen Klassen Es kann auf drei Arten von generischen Klassen geerbt werden Die erbende Klasse ist generisch, geerbte nicht class Box<E> extends Base Base Die erbende Klasse bleibt weiterhin generisch class Box<E> extends Base<E> Box Die erbende Klasse konkretisiert den Typ StringBox class StringBox extends Box<String> Base base; Box box; StringBox sbox; base = box; //ok box = sbox; //ok 25 von 51

Generische Interfaces public interface List<E> { public void add(e e); public E get(int i);... public class LinkedList <E> implements List<E> { private E first= null; public void add(e e){...... List<Integer> list = new LinkedList<Integer>(); 26 von 51

Mehrere generische Typen Mehrere Platzhaltertypen werden einfach durch "," abgetrennt public interface Map <K,V> { public void put(k key, V value); public V get(k key);... im im JDK JDK Object Object wegen wegen Abwärtskompatibilät Abwärtskompatibilät 27 von 51

Generics und Subtyping List<String> ls = new ArrayList<String>(); List<Object> lo = ls; ok? Problem lo.add(new Integer(4)); // unsafe String s = ls.get(0); // run time error nein! nein! Compile Compile time time error. error. Bar G<Bar> Foo G<Foo> Wenn Foo Oberklasse Bar ist und G eine generische Typendeklaration dann ist G<Foo> keine Oberklasse von G<Bar>. 28 von 51

Übung 1 Generischer ADT 1) Definieren Sie das Stack Interface generisch 2) Erben Sie von dieser Klasse und beschreiben Sie die Methoden aber noch ohne Implementation 29 von 51

Übung 2 Implementation 1) Implementieren Sie die push Methode Ihrer ListStack Methode mittels einer generischen Liste 2) Instanzieren Sie eine Stack Klasse von Integer 30 von 51

Wildcards 31 von 51

Klassen mit Wildcards Ein bewusstes "Vergessen" der Typinformationen lässt sich durch das Wildcard Zeichen? erreichen. Es erlaubt, verschiedene Unterklassen zusammenzuführen. Wildcards dienen dazu, unterschiedliche parameterisierte Typen zuweisbar und damit in einer Methode benutzbar zu machen. Nur lokale Variable und Methoden-Parameter können mit Wildcards benutzt werden! Box<Object> b; Box<Integer> bi = new Box<Integer>(); Box<Double> bd = new Box<Double>(); b = bi; // --> Compile-Error b = bd; // --> Compile-Error Variablendeklaration mit Wildcards Box<?> bw; bw = bl; // ok bw = bi; // ok bw = b; // ok 32 von 51

Methoden mit Wildcards Eine Methode die alle enthaltenen Elemente einer Collection ausgibt: früher: public void printcollection(collection c) { iterator iter = c.iterator(); while(iter.hasnext()) { System.out.println(iter.next()); 33 von 51

Methoden mit Wildcards Eine Methode die alle enthaltenen Elemente einer Collection ausgibt: naiver Ansatz Java 5 public void printcollection(collection<object> c) { for(object e:c) { System.out.println(e); Funktioniert aber nur mit Collections mit dem Parametertyp <Object> List<String> kann ja nicht List<Object> zugewiesen werden 34 von 51

Methoden mit Wildcards Eine Methode die alle enthaltenen Elemente einer Collection ausgibt: Java 5 public void printcollection(collection<?> c) { for(object e:c) { System.out.println(e); Collection<?> ist der Oberklasse aller Collections 35 von 51

Bounds 36 von 51

Generics, Bounded Wildcards abstract class Figure { public abstract void draw(); class Circle extends Figure { public void draw() {; class Rectangle extends Figure { public void draw() { class RoundedRectangle extends Rectangle { public void draw() { Figure Circle Rectangle public void drawall(list<figure> figures) { for (Figure f : figures) f.draw(); RoundedRectangle List<Circle> lc = new LinkedList<Circle>(); drawall(lc); // ok? nein! nein! Compile Compile time time error. error. 37 von 51

Generics, Bounded Wildcards public void drawall(list<?> figures) { for (Figure f : figures) f.draw(); List<Circle> lc = new LinkedList<Circle>(); drawall(lc); // ok? Problem List<Figure> ist zu restriktiv List<?> zu offen (keine Information über Typ) Wir wollen eigentlich ausdrücken: "irgend ein Typ der von Figure erbt" Upper Bound Wildcard nein! nein! Compile Compile time time error.: error.: draw draw Methode Methode nicht nicht bekannt bekannt public void drawall (List<? extends Figure> figures) { for (Figure f : figures) f.draw(); List<Circle> lc = new ArrayList<Circle>(); drawall(lc); 38 von 51

Generics, Bounded Wildcards Methode die ein Rectangle zu einer generischen Liste von Rectangles hinzufügt, z.b. List<Rectangles>, List<RoundedRectangles> public void addrectangle (List<? extends Figure> rects) { rects.add (new Rectangle()); // OK? Wir wollen ausdrücken, dass der Typ der Liste Rectangle oder RoundedRectangle ist, d.h. die Oberklasse Rectangle ist public void addrectangle (List<? super Rectangle> rects) { rects.add (new Rectangle); // OK? Nein: Nein: Figures Figures könnte könnte eine eine Liste Liste von von Circles Circles sein sein und und wir wir fügen fügen ein ein Rechteck Rechteck dazu dazu Lower Bound Wildcard Ja: Ja: Liste Liste von von Rectangle Rectangle und und RoundedRectangle RoundedRectangle sind sind erlaubt erlaubt 39 von 51

Bounded Wildcards, Methoden Abhängigkeit zwischen zwei Typen in Kombination mit Wildcards class Collections { public static <T> void copy(list<t> dest, List<? extends T> src) {... auch möglich class Collections { public static <T, S extends T> void copy(list<t> dest, List<S> src) {... 40 von 51

WildCards bei Rückgabetyp Upper bound wildcards (extends) erlauben lesende Funktionen, also Funktionen, die einen parametrisierten Typ zurückgeben. public List<? extends Figure> getfigures () { 41 von 51

Oberklasse aller numerischen Typen java.lang.number ist Oberklasse von Integer, Long, Double,.. Somit public List<? extends Number> getvaluelist() { Eine Liste von numerischen Werten class Number { double doublevalue() Returns the value of the specified number as a double. float floatvalue() Returns the value of the specified number as a float. int intvalue() Returns the value of the specified number as an int. long longvalue() Returns the value of the specified number as a long. short shortvalue() Returns the value of the specified number as a short. 42 von 51

Aufgabe 3 1) Definieren Sie eine generische max Methode (Werte müssen von identischem Typ und vergleichbar sein) 2) Definieren Sie eine generische PriorityQueue Klasse, so dass der Wert beliebig und die Priorität ein von Comparable abgeleiteter Typ ist public class PriorityQueue public push(object o, Priority p) 43 von 51

Raw Types & Type-Erasure 44 von 51

Raw Type Wenn man eine Variable ohne "<>" (wie 1.4) deklariert, dann spricht man von einem Raw Type Raw Types und Generic Types sind Zuweisungskompatibel; die statische Typensicherheit geht aber verloren; es werden deshalb vom Compiler Warnungen generiert Mittels SuppressWarnings("unchecked") lassen sich diese ausschalten Box<String> bs = new Box<String> Box raw; //Raw Type raw = bs; // ok @SuppressWarnings("unchecked") bs = raw; // unchecked Warning bs = (Box<String>)raw; // unchecked Warning 45 von 51

Type Erasures Java entfernt die Typeninformation vollständig zur Laufzeit Entscheid des Java Design Teams zur Implementierung der Aufwärtskompatibilität Aus Box<T> wird zur Laufzeit Box<Object> und Störend: Daraus ergeben sich Einschränkungen keine Typenprüfung möglich: if (e instanceof List<LinkedList) Cast sind nicht überprüfbar -> Warnung E e = (E)o; kein Instanzierung möglich E e = new E(); keine Arrays von E[] a = new E[10]; 46 von 51

Type Erasures Beim Ablauf des Programms kann nicht mehr von z.b. LinkedList<String> und LinkedList<Integer> unterschieden werden. Beide habe zur Laufzeit den Typ LinkedList<Object> List <String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getclass()); Auch Casts funktionieren nicht wirklich <T> T badcast(t t, Object o) { return (T) o; // unchecked warning 47 von 51

Type Erasures und Erzeugung von Instanzen Erzeugung von Instanzen funktioniert nicht E e = new E(); // not allowed Lösung: man gebe beim Aufruf noch die Class<T> mit; dann kann ich mit newinstance eine Instanz erzeugen <T> T foo(class<t> clazz, String s) { return (T)clazz.newInstance(); String s = foo(string.class,"hallo"); 48 von 51

Type Erasures und Arrays Eine Array von generischen Typen kann nicht angelegt werden List<T>[] lsa = new List<T>[10]; // not allowed Lösung man verwendet Wildcards List<?>[] lsa = new List<?>[10]; // ok, array of unbounded type Oder Variable mit Typ; cast -> warnung List<T>[] lsa = (List<T>[])new List<?>[10]; / 49 von 51

Type Erasures und Arrays Setzen von Werten lsa[0] = new LinkedList<T>(); // not allowed Umweg über Object und Cast funktioniert aber lsa[0] = (LinkedList<T>)new LinkedList<Object>(); 50 von 51

Zusammenfassung Autoboxing und Unboxing Erweiterte for-schleife Variable Anzahl Methoden-Argumente und printf Enumerationen Statische Imports Generics Generische Typen und Methoden erhöhen die Sicherheit, da Typprüfungen zur Laufzeit reduziert werden Viele falsche Typzuweisungen werden vom Compiler abgelehnt Die Aussagekraft des Quelle wird erhöht Es gibt aber Einschränkungen und Ausnahmen, die das Arbeiten mit Java Generics erschweren 51 von 51