Probleme ohne generische Typen

Ähnliche Dokumente
8. Generics Grundlagen der Programmierung 1 (Java)

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

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

OOP. Tagesprogramm. Generizität

Einstieg in die Informatik mit Java

Arten des universellen Polymorphismus

Java I Vorlesung Generics und Packages

Gebundene Typparameter

Kapitel 8. Generische Klassen

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

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

Teil V. Generics und Kollektionen in Java

1 Polymorphie (Vielgestaltigkeit)

Stack stack = new Stack(); stack.push ("Würstchen"); string s = (string) stack.pop(); Console.WriteLine (s);

Java I Vorlesung 6 Referenz-Datentypen

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

Java 5 "Tiger" Erweiterungen

Skript Informatik B. Grundlagen der Software-Entwicklung

Objektorientierte Programmierung. Kapitel 20: Generische Programmierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Arten des universellen Polymorphismus

Java Einführung Collections

Java I Vorlesung Collections

public interface Stack<E> { public void push(e e); public E pop();

Algorithmen und Datenstrukturen II

Java Generics & Collections

9. Kapitel GENERICS. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Einführung in die Programmierung

Einstieg in die Informatik mit Java

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Generische Datenstrukturen

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

1 Abstrakte Klassen, finale Klassen und Interfaces

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

12) Generische Datenstrukturen

Programmieren 2 Java Überblick

Probeklausur: Programmierung WS04/05

Programmierkurs Java

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Info B VL 8: Abstrakte Klassen & Interfaces

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

Objektorientierte Sprachen

Polymorphie in Java oder Generics und Co.

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

Vorlesung Informatik 2

Objektorientierte Programmierung. Kapitel 21: Generische Programmierung

Grundlagen der Informatik Generische Klassen

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

Neue Features in C# 2.0

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

Kapitel 5: Generische Datentypen

12) Generische Datenstrukturen

Javakurs für Anfänger

Vorlesung Programmieren

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Algorithmen und Programmierung II

Typumwandlungen bei Referenztypen

JAVA KURS COLLECTION

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

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

Th. Letschert OOP 2 1. Vererbung I : Subklasse und Subtyp

Probeklausur: Programmierung WS04/05

Informatik II - Übung 06. Christian Beckel

Java Einführung Abstrakte Klassen und Interfaces

Javakurs zu Informatik I. Henning Heitkötter

Objektorientierung (OO)

Kapitel 6. Vererbung

Java für Computerlinguisten

Prinzipien Objektorientierter Programmierung

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

Kapitel 6. Vererbung

Schnittstellen implementieren am Beispiel Suchbaum

Einführung in C#.NET. 1 Übersicht. 2 Typen (Types) Dieser Artikel stammt aus dem Magazin von C++.de (

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Kapitel 6. Vererbung

Objektorientierte Programmierung. Kapitel 20: Wrapper-Klassen

Fortgeschrittene Programmierung

Prof. Dr. Uwe Schmidt. 21.August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (BInf 211, BTInf 211, BMInf 211, BWInf 211)

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

Vorlesung Programmieren

12) Generische Datenstrukturen

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

Algorithmen und Datenstrukturen 07

Interfaces und Vererbung

Programmiertechnik II Klausur WS 15/16 Angewandte Informatik Bachelor

Java Vererbung. Inhalt

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

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Informatik II (D-ITET) Übungsstunde 6

Relationen-Algebra und Persistenz Teil I

Master of Advanced Studies in Software Engineering Java - Advanced Concepts. Musteraufgaben

Kapitel 4: Klassen und Unterklassen

B Java RMI B.2 B.4. 1 Java. 1.2 Methoden. 1.1 Objekte (2) 1.1 Objekte. Objektorientierte Sprache. Klassenbeschreibung. Methode ist eine Art Funktion

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

Besonderheiten von C#

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Vererbung & Schnittstellen in C#

Programmieren I. Kapitel 8. Vererbung

Transkript:

Generics seit Java1.5 SSJ Kapitel 15 Probleme ohne generische Typen Klassen, die mit Objekten verschiedenen Typs arbeiten können class List { Object[ ] data = ; void add(object x) { Object remove() { Probleme Typumwandlungen nötig list.add(3); int x = (Integer)list.remove(); // Boxing kostet Zeit // Typumwandlung und Unboxing kosten Zeit Spezielle Typen IntList, PersonList, führen zu Redundanz Homogenität kann nicht erzwungen werden list.add(3); list.add(new Person()); Person p = (Person) list.remove(); // kann zu Laufzeitfehler führen! Page 1

Generische Klasse List generischer Typ Platzhalter class List<T> { T[ ] data; List(int size) { void add(t x) { T remove() { geht auch für Interfaces Platzhaltertyp T kann wie normaler Typ verwendet werden Benutzung List<Integer> a = new List<Integer>(100); a.add(3); // nur Integer-Parameter erlaubt; hier Boxing int i = a.remove(); // liefert Integer-Wert; kein Cast nötig List<Person> b = new List<Person>(100); b.add(new Person()); // nur Person-Parameter erlaubt Person p = b.remove(); // kein Cast nötig aktueller Typparameter muß ein Referenztyp sein (Integer, Rectangle, ) Vorteile Homogene Datenstruktur mit Compilezeit-Typprüfung Man muß keine Casts schreiben Generizität auch in Ada, Eiffel, C++ (Templates), C# Mehrere Platzhaltertypen Liste mit Schlüsseln und Werten class List <K, V> { K[] keys = ; V[] values = ; void add(k key, V value) { V remove(k key) { Verwendung List<String, Person> list = new List<String, Person>(); list.add("meier", aperson); aperson = list.remove("meier"); List<Integer, String> list = new List<Integer, String>(); list.add(17, "Pizza"); String s = list.remove(17); Page 2

Rohtypen Generischer Typ class List<T> { T[ ] data; List(int size) { void add(t x) { T remove() { wird übersetzt zu Rohtyp class List { Object[] data; List(int size) { void add(object x) { Object remove() { Alle aus List<T> erzeugten Typen werden auf denselben Rohtyp abgebildet List<String> stringlist = new List<String>(10); stringlist.add("abc"); List<Integer> intlist = new List<Integer>(100); intlist.add(15); rufen beide add von List auf und übergeben einen Object-Parameter. Compiler stellt aber sicher, daß intlist nur mit Integer-Werten verwendet wird. Kompatibilitätsbeziehungen List <String> Object List List <Integer> List list = new List<String>(10); Object obj = new List<String>(10); List<Integer> x = new List<String>(10); // ok // ok // verboten Generics Page 3

(Bounded Type Parameters) Annahmen über Platzhaltertypen werden als Basistypen ausgedrückt class SortedList <T extends Comparable> { T[ ] data = ; int nelements = 0; void add(t elem) { int i = nelements - 1; while (i >= 0 && elem.compareto(data[i]) > 0) {data[i+1] = data [ i] ; i--; data [ i+1 ] = elem; nelements++; Erlaubt Operationen auf Elemente von Platzhaltertypen Verwendung SortedList<String> list = new SortedList<String>(); List.add("John"); Parameter muß Comparable unterstützen Mehrere möglich class Hashtable <K extends Comparable, V extends MyClass & Serializable> { void put(k key, V value) { V get(k key) { Verwendung muß Comparable implementieren muß von MyClass abgeleitet sein und Serializable implementieren Hashtable<String, MySubclass> tab = new Hashtable<String, MySubclass>(); tab.put("john", new MySubclass()); Page 4

Generics verboten class List<E, P extends Comparable> { E[ ] data = new E[10]; P[ ] prio = new P[10]; Man darf weder ein Array von Typparametern erzeugen new E[10] new P[10] noch ein Array aus erzeugten Typen Warum? new List<String, Integer>[10] VM weiß nicht, welcher konkrete Typ hinter E und P steckt. erlaubt class List<E, P extends Comparable> { E[ ] data = (E[ ]) new Object[10]; P[ ] prio = (P[ ]) new Comparable[10]; Compiler erzeugt eine Warnung! Warum? Angenommen, List hat folgende Methode E bang() { Object[] a = data; a[0] = crash!"; return data[0]; Dann liefert folgendes eine ClassCastException List<Integer, Integer> list = ; Integer x = list.bang(); Ohne Warnung käme Exception überraschend. Page 5

Generics Generizität und class List <T> extends BaseList<T> { kann auch generische Interfaces implementieren List <T> implements B<T> Von welchen Klassen darf eine generische Klasse erben? von einer gewöhnlichen Klasse class B<X> extends A { von einer konkretisierten class B<X> extends A<String> { generischen Klasse von einer generischen Klasse class B<X> extends A<X> { mit gleichem Platzhalter Page 6

Kompatibilität in Zuweisungen Zuweisung von X< T > an gewöhnliche Oberklasse class A { class B<T> extends A { class C<T,U> extends A { B<T> A C<T,U> A a1 = new B<Integer>(); A a2 = new C<Integer, Float>(); B<Integer> C<Integer,Float> B<Float> C<Float,Integer>.. Zuweisung von X< T > an generische Oberklasse class A<T>{ class B<T> extends A<T> { class C<T,U> extends A <T>{ B<T> A<T> C<T,U> A<Integer> a1 = new B<Integer>(); A<Integer> a2 = new C<Integer, Float>(); A<Short> a3 = new B<Integer>(); erlaubt, wenn korrespondierende Platzhalter durch denselben Typ ersetzt wurden VERBOTEN! Überschreiben von Methoden class List<T> { void add(t x) { Wenn von konkretisierter Klasse geerbt class MyList extends List<Integer> { void add(integer x) { Wenn von generischer Klasse geerbt class MyList<T> extends List<T> { void add(t x) { T wird durch konkreten Typ Integer ersetzt T bleibt als Platzhalter Folgendes geht nicht (man kann keinen Platzhalter erben) class MyList extends List<T> { void add(t x) { VERBOTEN! Page 7

Generics Parametrisierte Typen, bei denen der Typenparameter egal ist List <?> list; List of unknown Kompatibel mit List of any Wozu? gemeinsamer Basistyp für List of any List<Object> ist kein gemeinsamer Basistyp List <Object> list = new List<String>(); //verboten Kompatibilitätsbeziehung A<T> B<T> A<?> a = new A<String>(); A<?> a = new A<Integer>(); A<?> a = new B<String>(); A a = new A<String>(); Object a = new A<String>(); Object A A<?> A<String> B B<?> B<String> Page 8

Bounded Ausgangssituation (Beispiel) class List<T> { void add (T x) { T remove() { Person Student Teacher. List<Student> students = new List<Student>(); students.add(new Student()); students.add(new Student()); List<Teacher> teachers = new List<Teacher>(); teachers.add(new Teacher()); teachers.add(new Teacher()); Wildcard kann auf bestimmte Basistypen eingeschränkt werden List<? extends Person> list; list = teachers; list = students; Person pers = list.remove(); list.add(new Student()); list.add(new Person()); // ok // Compilefehler // Compilefehler list enthält zumindest List<Person> man kann zu list keine neuen Elemente mehr hinzufügen, aber welche entnehmen. Die sind dann vom Typ Person. Kompatibilitätsbeziehung Object List List<?> List<? extends Person> List<Student> List<Teacher> Generics Page 9

Methoden, die mit unterschiedlichen Datentypen arbeiten können static <T> void copy (T[] src, List<T> dst) { for (T elem: src) dst.add(elem); Benutzung Integer[] a = {3, 7, 2, 5, 3; List<Integer> list = new List<Integer>(); copy(a, list); // list == {3, 7, 2, 5, 3 String[] s = {"one", "two", "three"; List<String> list = new List<String>(); copy(s, list); // list == {"one", "two", "three" kopiert ein Array in eine Liste (Elementtyp beliebig) Typ von T wird automatisch aus den aktuellen Parametertypen abgeleitet Unterschied zu void copy (Object[] src, ObjList dst) { for (Object elem: src) dst.add(elem); Hier keine statische Typsicherheit: Compiler garantiert nicht, daß Array und ObjList denselben Elementtyp haben Generics Page 10

Laufzeit-Typprüfung List<String> und List<Integer> werden zur Laufzeit wie List behandelt. VM kennt den Typparameter nicht! Laufzeitprüfungen funktionieren bei Generics nicht oder nur eingeschränkt List<String> list = new List<String>(); Object obj = list; if (obj instanceof List<String>) list = (List<String>) obj; Compilefehler: VM kann nicht prüfen, ob obj vom Typ List<String> ist Warnung: VM kann nicht garantieren, daß obj vom Typ List<String> ist Page 11