Java I Vorlesung Generics und Packages

Ähnliche Dokumente
Java I Vorlesung 6 Referenz-Datentypen

Neuere Sprachelemente in Java

Java I Vorlesung Vererbung und Sichtbarkeit

ADT: Java Collections und ArrayList

Einstieg in die Informatik mit Java

Methoden und Wrapperklassen

JAVA 5 Generics. Proseminar Programmiersprachen Thema Java 5 Generics 1

Java I Vorlesung Collections

Modularisierung in Java: Pakete Software Entwicklung 1

Teil V. Generics und Kollektionen in Java

8. Generics Grundlagen der Programmierung 1 (Java)

Kapitel 8. Generische Klassen

Javakurs zu Informatik I. Henning Heitkötter

4. Vererbung Die Klasse Object. Die Klasse Object

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

II.4.4 Exceptions - 1 -

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Polymorphie in Java oder Generics und Co.

Kapitel 8. Generische Klassen

Ursprünge. Die Syntax von Java. Das Wichtigste in Kürze. Konsequenzen. Weiteres Vorgehen. Rund um Java

1 Klassen und Objekte

1 Klassen anlegen und Objekte erzeugen

Java Einführung Abstrakte Klassen und Interfaces

Programmierkurs Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Arten des universellen Polymorphismus

II.4.5 Generische Datentypen - 1 -

1 Klassen anlegen und Objekte erzeugen

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

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Gebundene Typparameter

Vererbung, Polymorphie

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

Einstieg in die Informatik mit Java

Deklaration einer Klasse Innere innerhalb Klassen einer in Ja anderen v a Klasse

Programmieren 2 16 Java Collections und Generizität

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

Repetitorium Informatik (Java)

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

Remote Method Invocation

Programmieren in C++ Templates

Programmierkurs Java

Algorithmen und Datenstrukturen

Dynamische Typinformation A01 OOP. Dynamische Typinformation

Fragen zur OOP in Java

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Wiederholung aus SWE2

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Objektorientierte Programmierung. Kapitel 16: Pakete, Zugriffsschutz

Einstieg in die Informatik mit Java

Programmieren in Java -Eingangstest-

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

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Tag 8 Repetitorium Informatik (Java)

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Programmieren in Java

Klassen mit Instanzmethoden

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

Einleitung Typsystem Typisierung Zusammenfassung Literatur. Typisierung. Effiziente Programmierung. Thomas Schnieders

Java: Vererbung. Teil 3: super()

Programmiermethodik 1. Klausur

12 Abstrakte Klassen, finale Klassen und Interfaces

3 Objektorientierte Konzepte in Java

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Interfaces und Generics

Objekt-Orientierte Programmierung

ListElement (E i n f o, ListElement<E> prev, ListElement<E> next ) {

Algorithmen und Datenstrukturen

2 Eine einfache Programmiersprache

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

3 Objektorientierte Konzepte in Java

Einstieg in die Informatik mit Java

II.1.1. Erste Schritte - 1 -

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

Einstieg in die Informatik mit Java

Tag 7 Repetitorium Informatik (Java)

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

2 Eine einfache Programmiersprache

C++ Klassen weitere Funktionen

Transkript:

Java I Vorlesung 9 Generics und Packages 21.6.2004 Generics Packages Qualifizierte Namen Mehr zu Zugriffsklassen Generics (Java 1.5) Die Klassen im Java Collections Framework sind mit dem Typ ihrer Elemente parametrisiert: List<Integer> List<String> usw. Solche parametrisierbaren Klassen und Interfaces heißen Generics. Wir können unsere eigenen Generics programmieren, die dann von anderen instanziiert werden können. http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf 2

Generics: Syntax Man definiert eine generische Klasse (oder Interface), indem man in spitzen Klammern Typvariablen angibt: class GenerischeKlasse<E, T> {... Innerhalb der Klassendeklaration kann man dann die Typvariablen (fast) wie normale Referenztypen verwenden. Bei Verwendung von GenerischeKlasse<A,B> mit konkreten Referenztypen A und B wird dann überall A für E und B für T eingesetzt. 3 Beispiel: Generics class MyArrayList<E> { private E[] array; private int nextpos; public MyArrayList() { array = new E[10]; nextpos = 0; public void add(e x) { array[nextpos++] = x; public E get(int index) { return array[index]; 4

Beispiel: Generics MyArrayList<String> x = new MyArrayList<String>(); x.put("1234"); // x.get(0) ist Ausdruck von Typ String MyArrayList<Integer> y = new MyArrayList<Integer>(); y.put(new Integer(3)); // y.get(0) ist Ausdruck von Typ Integer 5 Bounded Types Compiler weiß nichts über die Referenztypen, die für Typ-Parameter eingesetzt werden. Deshalb sind für Ausdrücke von parametrischem Typ nur die Methoden von Object verfügbar. Wir können erzwingen, dass Typ-Parameter nur mit Typen instanziiert wird, die spezieller als ein bestimmter Referenztyp sind: class A<E extends XY> {... Damit können wir Methoden von XY verwenden. 6

Beispiel: Bounded Types class A { public void meth() {... class SomeClass<E> { public void dosomething(e obj) { obj.meth(); // verboten A x = new A(); SomeClass<A> sca = new SomeClass<A>(); sca.dosomething(x); 7 Beispiel: Bounded Types class A { public void meth() {... class SomeClass<E extends A> { public void dosomething(e obj) { obj.meth(); // ok A x = new A(); SomeClass<A> sca = new SomeClass<A>(); sca.dosomething(x); 8

Beispiel: Bounded Types class A { public void meth() {... class SomeClass<E extends A> { public void dosomething(e obj) { obj.meth(); // ok // verboten: SomeClass<Object> sca = new SomeClass<Object>(); 9 Generics und Subtyping Subtyping auf den generischen Klassen selbst: Wenn C spezieller als D ist, ist natürlich C<A> spezieller als D<A>. Kein Subtyping über die Typ-Parameter: Auch wenn A speziellerer Typ ist als B, sind C<A> und C<B> unvergleichbare Typen. Warum? 10

Generics und Subtyping class C<E> { public void put(e x) {... public E get() {... class B extends A {... C<B> cb = new C<B>(); C<A> ca = cb; A a = new A(); // automatischer Upcast // wollen wir folgendes dürfen? ca.put(a); B b = cb.get(); 11 Teil-Lösung: Wildcards Es gibt einen Wildcard-Typen C<?>, der allgemeiner ist als jedes C<A>. Man kann damit aber nicht viel machen: Von "innen" kann man nur annehmen, dass Typ-Parameter Object ist. Von "außen" kann man keine Argument an eine Methode mit Parameter von Parametertyp geben. Returnwerte von unbekanntem Parametertyp sind immerhin Object oder spezieller. 12

Generics und Subtyping List<?> list = new ArrayList<String>(); // ok // illegal: passt Parameter-Typ zu String? list.add("hallo"); int s = list.size(); // ok Object o = list.get(0); // ok 13 Bounded Wildcards Man kann Typ-Bounds auch bei Wildcards einsetzen: List<? extends A> Dieser Typ ist allgemeiner als List<A> und List<B>. Nicht allgemeiner als List<C>, wenn C nicht spezieller als A ist. Kann dann annehmen, dass Returntypen spezieller als A (statt Objekt) sind. 14

Generische Methoden Auch Methoden können Typ-Parameter bekommen: public <E, T> int meth(e x, T y) {... Typ-Parameter kann mehrfach auftreten: Abhängigkeiten zwischen Typen. Beim Aufruf werden Typ-Parameter aus den Typen der Argumente inferiert. Konkrete Typ-Parameter können nicht explizit angegeben werden. 15 Beispiel: Generische Methoden static <T> void tocollection(t[] a, Collection<T> c) { for( T element : a ) { c.add(element); String[] array = { "a", "b", "c" ; List<String> list = new ArrayList<String>(); tocollection(array, list); 16

Bounds bei generischen Methoden Auch bei generischen Methoden können Wildcards und Bounded Wildcards verwendet werden: Parametertyp C<?>: Alle Typen C<A> Typ C<? extends A>: Alle Typen C<B>, bei denen B spezieller als A ist Typ C<? super A>: Alle Typen C<B>, bei denen B allgemeiner als A ist 17 Beispiel: Bounds bei Methoden public static <T> T writeall( Collection<T> coll, Sink<T> sink) { T last = null; for( T t : coll ) { sink.write(t); last = t; return last; Sink<Object> sink =...; Collection<String> coll =...; String str = writeall(coll, sink); // nein: Inkompatible Typen für T! 18

Beispiel: Bounds bei Methoden public static <T> T writeall( Collection<? extends T> coll, Sink<T> sink) { T last = null; for( T t : coll ) { sink.write(t); last = t; return last; Sink<Object> sink =...; Collection<String> coll =...; String str = writeall(coll, sink); // besser (String extends Object) -- // aber falscher Returntyp! 19 Beispiel: Bounds bei Methoden public static <T> T writeall( Collection<T> coll, Sink<? super T> sink) { T last = null; for( T t : coll ) { sink.write(t); last = t; return last; Sink<Object> sink =...; Collection<String> coll =...; String str = writeall(coll, sink); // jetzt ok! 20

Generics: Einschränkungen Typ-Parameter müssen Referenztypen sein, keine primitiven Typen. Man kann aber mit List<Integer> u.ä. Listen von primitiven Typen simulieren. Autoboxing und -unboxing: Compiler führt oft Konvertierung zwischen int und Integer (Boxing) und umgekehrt automatisch aus. Innerhalb der Klassendefinition dürfen Typ- Parameter nicht beliebig verwendet werden: keine Instanziierung, z.b. new E() 21 Packages Man kann verschiedene Klassen zu einer Package zusammenfassen. Packages bilden größere logische Einheit. Aufteilung von Namensräumen. Klassen haben privilegierten Zugriff auf Felder und Methoden der Klassen in gleicher Package. Klassen der gleichen Package liegen typischerweise im gleichen Verzeichnis. 22

Deklaration von Packages Man ordnet eine Klasse (oder Interface) durch eine package-anweisung einer Package zu: package name.mit.punkten; Der qualifizierte Name der Klasse ist dann name.mit.punkten.klassenname Der Compiler legt die Bytecode-Datei ins Verzeichnis name/mit/punkten 23 Package ohne Namen Wenn die Datei keine package-anweisung enthält, gehört sie zur "namenlosen Package". Voll qualifizierter Name der Klasse C in der namenlosen Package ist einfach C. Verhält sich ansonsten genau wie richtige Packages. 24

Zugriff auf Klassen in Packages Man kann immer den voll qualifizierten Namen einer Klasse verwenden. Auf Klassen aus der gleichen Package kann man mit Namen ohne Packagebezeichnung zugreifen. Mit einer import-anweisung kann man Klassen aus anderen Packages importieren: import andere.pkg.klassenname; import andere.pkg.*; 25 Packages und Verzeichnisse JVM sucht Klassen der Package a.b.c im Verzeichnis a/b/c. Dorthin werden sie auch kompiliert. Guter Stil: Auch Quelltexte entlang der Package-Struktur organisieren. Guter Stil: Verwendet Packages! D.h. außer in winzigen Programmen keine Klassen in namenloser Package. Guter Stil: Eindeutiges Packagenamen-Präfix (com.sun...; edu.mit...; de.saar...; usw.) 26

Die Zugriffsklasse "package" Wir kennen bisher zwei Zugriffsklassen: public: Feld/Methode von überall zugreifbar private: nur aus Klasse selbst zugreifbar Zugriffsklasse "package": von allen Klassen in der Package aus zugreifbar. "package" ist Standard-Zugriffsklasse: Wird verwendet, wenn keine besondere Zugriffsklasse angegeben ist. 27 Zugriffsklassen von Klassen/Interfaces Auch Klassen und Interfaces haben Zugriffsklassen, die bestimmen, von wo man sie verwenden kann. Standard-Zugriffsklasse ist "package", d.h. Klasse kann nur aus eigener Package verwendet werden. Muss ggf. Klassen/Interfaces als "public" deklarieren. Klasse mit main-methode muss public sein. 28

Zusammenfassung Generics: Parametrisierte Referenztypen und Methoden Bounds, Wildcards Packages strukturieren größere Projekte 29

This document was created with Win2PDF available at http://www.daneprairie.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only.