Vorlesung Programmieren

Ähnliche Dokumente
Probleme ohne generische Typen

8. Generics Grundlagen der Programmierung 1 (Java)

Neuere Sprachelemente in Java

Java I Vorlesung Generics und Packages

Philipp Güttler Progwerkstatt. Enums, Interfaces und Generics

Einstieg in die Informatik mit Java

Interfaces und Generics

ADT: Java Collections und ArrayList

Algorithmen und Datenstrukturen. Übersicht. Interfaces und Generics. InsertionSort für Punkte. InsertionSort für Punkte

1 Einleitung Generizität Syntax... 2

Teil V. Generics und Kollektionen in Java

Java I Vorlesung Collections

Abschnitt 10: Typisierte Klassen

1. Welches Interface ist nicht von Collection abgeleitet? A. B. C. D. List Set Map SortedSet. 2. Welche Aussagen sind richtig?

Programmieren in Java

Vorlesung Informatik 2

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/ / 861

II.4.5 Generische Datentypen - 1 -

Programmierkurs Java

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

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

Programmieren 2 16 Java Collections und Generizität

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Einführung in die Programmierung

Realisierungsmöglichkeiten für parametrische Polymorphie

Software Entwicklung 1

Generisches Programmieren. Generisches Programmieren

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Propädeutikum Programmierung in der Bioinformatik

Vorlesung Inf-B

Einfache Liste: Ein Stapel (Stack) Ansatz. Schaubild. Vorlesung 1. Handout S. 2. Die einfachste Form einer Liste ist ein Stapel (stack).

Philipp Güttler Progwerkstatt Letzte Änderung: Enums, Interfaces, Generics und Threads

Dynamische Typinformation A01 OOP. Dynamische Typinformation

JAVA KURS COLLECTION

Javakurs für Anfänger

Lösungshinweise/-vorschläge zum Übungsblatt 9: Software-Entwicklung 1 (WS 2017/18)

Javakurs für Anfänger

Programmierkurs Java

Programmieren I und II

Algorithmen und Datenstrukturen

Gebundene Typparameter

Rechtsbelehrung. Java und OOP Das Buch Christian Silberbauer 144

Lösungen. Programmiermethodik. Sommersemester 2013 Übungstest Dauer: 60 Minuten

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Teil 2-3. Vorlesung. Modul: Programmierung B-PRG Grundlagen der Programmierung II

Programmiermethodik 1. Klausur

Informatik II Übung 6

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

Einstieg in die Informatik mit Java

Programmierung WS14/15 Lösung - Präsenzübung C. Aschermann, F. Frohn, J. Hensel, T. Ströder

Arten des universellen Polymorphismus

Java Quiz. public static <T> int binarysearch (List<? extends Comparable<? super T>> list, T key);

Programmierkurs Java

Kapitel 5: Iterierbare Container

Schein-/Bachelorklausur Teil 2 am Zulassung: Mindestens 14 Punkte in Teilklausur 1 und 50% der Übungspunkte aus dem 2. Übungsblock.

Informatik II Übung 7 Gruppe 7

Software Entwicklung 1

Wiederholung aus SWE2

Programmieren 2 Java Überblick

Algorithmen und Datenstrukturen II

Kapitel 5: Interfaces

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Java Einführung Collections

Klausur: Java (Liste P)

Vorlesung Programmieren

12 Abstrakte Klassen, finale Klassen und Interfaces

Interfaces, Generics und Exceptions

Vererbung, Polymorphie

II.4.4 Exceptions - 1 -

Programmierung WS12/13 Lösung - Präsenzübung M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Universität Karlsruhe (TH)

14 Abstrakte Klassen, finale Klassen, Interfaces

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Objektorientierte Programmierung Studiengang Medieninformatik

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

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

Programmieren I und II

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Java I Vorlesung 6 Referenz-Datentypen

Einstieg in die Informatik mit Java

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmierkurs Java

Die abstrakte Klasse Expression:

Datenstrukturen. Ziele

Info B VL 14: Java Collections/Reflections

Mengen und Multimengen

Methoden und Wrapperklassen

Informatik II Musterlösung

Algorithmen und Programmierung II

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Programmieren in Java

Objektorientierte Programmierung Studiengang Medieninformatik

Vererbung. CoMa-Übung XI TU Berlin. CoMa-Übung XI (TU Berlin) Vererbung / 47

Programmieren I und II

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

Programmieren in Java

Hashtags - Klausuraufgaben

Transkript:

Vorlesung 01.02.2007 Wintersemester 2006/2007 Computerlinguistik, Campus DU

Überblick Seite 2 Generezität Administratives

Einleitung Generezität ist eine der (wenn nicht sogar die) wesentlichen Neuerungen von Java 5: Typ-Parametrisierung von Klassen, Interfaces oder Methoden Anstatt eine Liste beliebiger Objekte zu implementieren: Liste von Personen Liste von Artikeln Liste von Namen bauen Seite 3

Bisherige Vorgehensweise (und Problematik) "a "a list list of of any any type type is is also also a list list of of no no type" type" Seite 4 import java.util.*; public class NonGenList { public static void main(string[] args) { List stringlist = new ArrayList(); // Eine String-Liste stringlist.add("first string"); add( add( Object o ) /*...*/ stringlist.add(new String[]{"Second String","String 3"); /*...*/ for (int i=0;i<stringlist.size();i++){ String x = (String) stringlist.get(i); System.out.println(x); First First string Exception in in thread "main" java.lang.classcastexception: [Ljava.lang.String; at at NonGenList.main(NonGenList.java:9)

Diskussion des Beispiels Homogene Liste: Verantwortung liegt beim Programmierer, Compiler ist»machtlos«list: add(object o) Vector: put(object) HashMap: put(object, Object)»Karneval für Objekte«(Suboptimale) Lösungen: instanceof-checks ArrayList stringlist, stringarraylist; Wünschenswert: Compiler soll Homogenität garantieren Seite 5

Problemlösung mit Generics (1) public class List<T> { T[] data =... void add (T x){... T remove (T x){... public static void main(string[] args) { List<String> list = new List<String>( ); list.add("hallo"); // Compiler: Typ okay list.add(new String[]{"Hello","Salut"); Typ-Parameter/Variable. Platzhalter, der der wie wie ein ein normaler Typ Typ benutzt benutzt werden werden kann. kann. T wurde wurde durch durch den den Typ Typ String ersetzt. ersetzt. Überall Überall dort, dort, wo wo T stand, stand, steht steht jetzt jetzt quasi quasi String. Compiler-Fehler! Exception in in thread "main" java.lang.error: Unresolved compilation problem: The The method add(string) in in the the type type List<String> is is not not applicable for for the the arguments (String[]) Weitere Weitere Referenztypen möglich: List<Integer> intlist = new newlist<integer>( ); ); List<JButton> buttonlist = new newlist<jbutton>( ); );...... Seite 6

Problemlösung mit Generics (2) Seite 7 List<String> list = new List<String>( ); list.add("some string"); list.add(new String ("Ello")); for ( int i=0; i<list.size(); i++ ){ String thestring = list.get(i); Homogene Liste Liste wird wird vom vom Compiler garantiert: Alle Alle Objekte Objekte sind sind de de facto facto Strings, Strings, kein kein Cast Cast mehr mehr nötig. nötig.

Diskussion des Beispiels Nur Referenztypen als Typparameter erlaubt Erlaubt: Integer, String, JFrame, List<JFrame>, Nicht erlaubt: Primitive Datentypen List<int>, List<double>, Dennoch funktioniert das Folgende. Warum? List<Integer> list = new List<Integer>; list.add(3); //add'en eines primi. Werts Seite 8

Kurzer Exkurs: Auto-Boxing public class BoxTest { public static void main(string[] args) { List<Integer> intlist = new List<Integer>(); intlist.add(112); // 112 --Autobox--> new Integer(112) List<Double> doublelist = new List<Double>(); doublelist.add(107.7); // 107.07 --Autobox--> new Double(107.7) List<Boolean> boollist = new List<Boolean>(); boollist.add(false); // false --Autobox--> new Boolean(false) Seite 9 Javas Javas Autobox-Feature: Primitive DT-Werte werden werden automatisch in in entsprechendereferenztyp-werte (via (via entspr. entspr. Wrapper-Klasse) umgewandelt.

Generics: Vorteile Compiler führt gezielt Typprüfungen durch List<String>: Garantie, dass an add() übergebene Werte vom Typ String sind Keine Typecasts und/oder expliziten instanceof-checks mehr nötig Eindeutig ersichtlich, welche Werte tatsächlich in List gespeichert werden (<String>) Generics können beliebig viele Typparameter besitzen. So z.b. java.util.map Seite 10

Generische Collection-API Javas Collection-API ist vollständig generisch Quelltext-Fragement von java.collection.map public class Map< K, V > {... public V put( K key, V value ) {... /* V: Ein eventuell vorhandener,»alter«wert */ public V get( K key ) {...... Seite 11 Anwendungsbeispiel: Map<String,Integer> phonebook = new HashMap<String,Integer>(); phonebook.put(new String("Donald Duck"), 112); phonebook.put("speedy Gonzales", 110); Integer phone = phonebook.get("donald Duck");

Einleitung: Rohtypen, Zuweisungskompatibilität (1) Seite 12 Compiler übersetzt generische Typen in Rohtypen: Typparemeter wird durch Object repräsentiert Rohtyp zu unserer List class List{ Object[] data =... void add( Object o ){ Object remove( ){ Wozu raw types? Kompatibilität zwischen J. 1.4 (bspw. ArrayList) und J. 1.5 1.4: ArrayList 1.5: ArrayList<T>

Einleitung: Rohtypen, Zuweisungskompatibilität (2) Zuweisungskompatibel: Generische Typen und ihr Rohtyp java.util.list stringlist = new java.util.arraylist<string>(); Nicht zuweisungskompatibel: Unterschiedliche Konkretisierungen eines generischen Typs java.util.list<boolean> boollist = new java.util.arraylist<string>(); Seite 13

Generics und Vererbung Behandlung wie bei gewöhnlichen Klassen Seite 14 Generische Klassen können erben und vererben Analog dazu die Behandlung von Interfaces class A1<T> extends B1{ class A2<T> extends B2<String> { class A3<T> extends B3<T> { class A4 extends B2<String>{ Okay: B2<String> ist konkretisiert class A5 extends B3<T>{ Verboten: B3<T> ist ein generischer Typ

Generics und Vererbung: Zuweisungskompatibilität B1 b1 = new A1<Integer>(); B1 b2 = new A1<JButton>(); B2<String> b3 = new A2<Integer>(); B2<String> b4 = new A2<JButton>(); B3<Integer> b5 = new A3<Integer>(); Erlaubt B3<Integer> b6 = new A3<Long>(); Verboten: Ungleiche Typparameter Seite 15

Wildcard-Typen Seite 16 Wildcard-Typ:?, bzw. <?> Rohtyp java.util.list somelist1 = new List<String>(); versus Wildcard java.util.list<?> somelist2 = new List<String>(); java.util.list<?> somelist3 = new List<JButton>();

Anwendung von Wildcard-Typen Seite 17 public class WildcardTest { public static void main(string[] args) { java.util.list<?> somegenericlist = new java.util.arraylist<integer>(); Object removedobject = somegenericlist.remove(0); somegenericlist.add(12); // verboten somegenericlist.add(new Integer(12)); // verboten Weder Weder Laufzeit Laufzeit noch noch Compiler können können wissen, wissen, von von welchem Typ Typ die die Elemente in in somegenericlist sind. sind. Verboten: Anstatt Anstatt von von ArrayList<Integer> könnten man man z.b. z.b. auch auch ArrayList<JTextField> zugewiesen haben. haben.

Eingeschränkte Wildcard-Typen Seite 18 public class WildcardTest { public static void main(string[] args) { java.util.arraylist<? extends Person> persons; persons =new java.util.arraylist<student>(); persons = new java.util.arraylist<person>(); persons =new java.util.arraylist<professor>(); /*... */ Person removedperson = persons.remove(0); // okay persons.add(new Person()); // verboten persons.add(new Student()); // verboten class Person{ class Student extends Person { class Professor extends Person { Sicher, Sicher, dass dass das das zurückgegebene Element Element mindestens vom vom Typ Typ Person Person ist. ist. Verboten, da da die die Liste Liste u.u. u.u. nicht nicht homogen ist ist

Weiteres zu Generics Gezeigtes ist nur Ausschnitt der radikalen Neuerungen durch Generics Eingeschränkte Typparameter Überschreiben von Methoden Laufzeitüberprüfung und Konversion Generische Methoden Bitte bis zur nächsten Sitzung z.b. hier nachlesen (aus Sprechen Sie Java? [Mössenböck:2006]) LINK_MOESS (ab morgen, 02.02.2006, aktiv) LINK_OREILL (ab morgen, 02.02.2006, aktiv) Seite 19

Administratives (1) Punkteverteilung: Gesamtbild Maximal mögliche Punktzahl insgesamt: 125 Klausur 60%: Maximal 75 Punkte Testat 40%: Maximal 50 Punkte Zum Bestehen der Veranstaltung sind mehr als 50% der 125 Punkte zu erreichen: 62.5 Punkte Beispiel: Sie haben 15 Punkte in der Klausur Um zu bestehen, brauchen Sie noch mehr als 47.5 Punkte aus der Testatataufgabe Seite 20

Administratives (2) Repetitorium: Dienstag, 13.02.2007, 14 Uhr Themen nach Wunsch, d.h. Gedanken machen, welche Themen im Repetitorium behandelt werden sollen E-Mails mit Themenvorschlägen bitte ausschließlich an curz@arcor.de Deadline: Kommender Donnerstag Seite 21

O'Reilly zum Thema Collection-API und Typecasts, d. vollständige Zitat It's kind of like a costume party for objects where everybody is wearing the same mask and disappears into the crowd of the collection. Once objects are dressed as the Object type the compiler can no longer see the real types and loses track of them. It's up to the user to pierce the anonymity of the objects later using a type cast. And like attempting to yank off a party-goer's fake beard, you'd better have the cast correct or you'll get an unwelcome surprise. Seite 22