Untitled

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Angenommen, a.compareTo(b) gibt einen negativen Wert zurück. Wie ist die Beziehung zwischen a und b gemäß der Konvention?

  • `a` und `b` sind unvergleichbar.
  • `a` ist gleich `b`.
  • `a` ist größer als `b`.
  • `a` ist kleiner als `b`. (correct)

Welche Aussage beschreibt am besten die Funktionalität der hasNext()-Methode im Iterator-Interface?

  • Sie liefert das nächste Element in der Aufzählung und entfernt es aus dem Behälter.
  • Sie liefert das nächste Element der Aufzählung.
  • Sie liefert `true`, wenn es noch weitere Elemente in der Aufzählung des Behälters gibt. (correct)
  • Sie liefert `true`, wenn das zuletzt mit `next()` gelieferte Element entfernt wurde.

Die remove()-Methode im Iterator-Interface ist als 'optional' gekennzeichnet. Was bedeutet das?

  • Sie muss in jeder Implementierung des `Iterator`-Interfaces vorhanden sein, darf aber nicht aufgerufen werden.
  • Sie muss immer aufgerufen werden, bevor `next()` aufgerufen wird.
  • Sie kann weggelassen werden, wobei ein Aufruf möglicherweise zu einer Ausnahme führt. (correct)
  • Sie ist obligatorisch und muss in jeder Implementierung korrekt funktionieren.

In der Point2D Klasse, was passiert wenn xc==0 in der compareTo Methode?

<p>Der Vergleich wird basierend auf dem y-Wert fortgesetzt. (D)</p> Signup and view all the answers

Was ist die Hauptaufgabe eines Iterators?

<p>Das Bereitstellen einer Möglichkeit, die Elemente eines Behälters in einer bestimmten Reihenfolge zu durchlaufen. (C)</p> Signup and view all the answers

In der MyListIterator-Klasse, welche Aufgabe hat die Variable cursor?

<p>Sie zeigt auf das nächste Element in der Liste. (C)</p> Signup and view all the answers

Welchen Wert gibt die hasNext()-Methode in MyListIterator zurück, wenn cursor gleich null ist?

<p><code>false</code> (D)</p> Signup and view all the answers

Was passiert, wenn die remove() Methode im Iterator Interface nicht implementiert wird?

<p>Es wird eine <code>UnsupportedOperationException</code> geworfen. (B)</p> Signup and view all the answers

Welchen Vorteil bietet die Verwendung von Interfaces wie List als Typ für Variablen und Parameter im Vergleich zur Verwendung konkreter Implementierungen wie ArrayList?

<p>Die Verwendung von Interfaces ermöglicht es, den Code flexibler zu gestalten, da verschiedene Implementierungen des Interfaces ausgetauscht werden können, ohne den restlichen Code zu ändern. (B)</p> Signup and view all the answers

Welchen Zweck erfüllt das Comparable Interface in Java?

<p>Es ermöglicht das Sortieren von Objekten durch Vergleich von zwei Objekten miteinander. (D)</p> Signup and view all the answers

Welche Aussage beschreibt am besten den Unterschied zwischen einer ArrayList und einer LinkedList hinsichtlich ihrer Performance?

<p><code>ArrayList</code> ist schneller beim Zugriff über den Index, während <code>LinkedList</code> schneller beim Einfügen von Elementen am Anfang der Liste ist. (A)</p> Signup and view all the answers

Welche Schnittstelle sollte man verwenden, um eine Sammlung von Objekten zu durchlaufen, ohne die spezifische Implementierung der Sammlung zu kennen?

<p><code>Iterator</code> (B)</p> Signup and view all the answers

Welche der folgenden Aussagen ist korrekt bezüglich der Methode compareTo(T o) des Comparable Interfaces?

<p>Sie gibt einen Integer-Wert zurück, der angibt, ob das Objekt kleiner, gleich oder größer als das übergebene Objekt ist. (C)</p> Signup and view all the answers

Angenommen, Sie haben eine sehr große Datenmenge und müssen häufig Elemente am Anfang der Liste einfügen. Welche Implementierung des List-Interfaces wäre am effizientesten?

<p><code>LinkedList</code> (D)</p> Signup and view all the answers

Sie schreiben eine Methode, die eine Liste von Zahlen sortieren soll. Welchen Typ sollte der Parameter der Methode haben, um die größtmögliche Flexibilität zu gewährleisten?

<p><code>List&lt;Integer&gt;</code> (C)</p> Signup and view all the answers

Welche der folgenden Methoden ist im List Interface definiert?

<p><code>add(E e)</code> (A)</p> Signup and view all the answers

Welche Aussage beschreibt am besten den Zweck der Iterable Schnittstelle in Bezug auf Schleifen?

<p>Sie ermöglicht die Verwendung der <code>for-each</code>-Schleife für Klassen, die diese Schnittstelle implementieren. (B)</p> Signup and view all the answers

Was ist die korrekte Syntax, um eine generische Klasse MeineKlasse zu deklarieren, die einen Typparameter T akzeptiert?

<p>class MeineKlasse&lt;T&gt; { ... } (B)</p> Signup and view all the answers

Die LinkedList Klasse implementiert die Iterable Schnittstelle. Welche Auswirkung hat dies auf die Verwendung von LinkedList?

<p>Eine <code>LinkedList</code> kann mit der <code>for-each</code>-Schleife durchlaufen werden. (C)</p> Signup and view all the answers

Welche der folgenden Aussagen ist FALSCH bezüglich der Verwendung von Generics in Java?

<p>Die Anzahl der Typparameter in einer generischen Deklaration ist auf maximal drei beschränkt. (A)</p> Signup and view all the answers

Was passiert, wenn man versucht, einer generischen List<Integer> ein Objekt vom Typ String hinzuzufügen?

<p>Der Compiler erzeugt einen Fehler, da der Typ <code>String</code> nicht mit dem Typ <code>Integer</code> übereinstimmt. (D)</p> Signup and view all the answers

Betrachten Sie folgenden Code: List<Point2D> list = new LinkedList<>();. Was bedeutet Point2D in dieser Deklaration?

<p><code>Point2D</code> ist ein Typparameter, der angibt, dass die Liste nur Objekte vom Typ <code>Point2D</code> enthalten kann. (C)</p> Signup and view all the answers

Welche der folgenden Schnittstellen wird von der Schnittstelle List erweitert?

<p><code>Iterable</code> (C)</p> Signup and view all the answers

Warum ist es vorteilhaft, Generics anstelle von Object als allgemeinen Typ in Sammlungen zu verwenden?

<p>Generics bieten Typsicherheit zur Compile-Zeit und vermeiden somit <code>ClassCastException</code> zur Laufzeit. (C)</p> Signup and view all the answers

Warum ist der Aufruf der Methode add innerhalb einer Methode, die eine LinkedList mit einem Wildcard-Typ als Typargument verwendet, eingeschränkt?

<p>Weil der Typparameter der generischen <code>LinkedList</code> unbekannt ist, und <code>add</code> diesen in der Parameterliste verwendet. (A)</p> Signup and view all the answers

Welche Einschränkung tritt auf, wenn Methoden einer LinkedList den Typparameter als Ergebnis liefern?

<p>Es kann nur davon ausgegangen werden, dass das Ergebnis zur Klasse <code>Object</code> gehört. (D)</p> Signup and view all the answers

Wie können nach unten beschränkte Wildcards dazu beitragen, Einschränkungen bei der Verwendung von LinkedList aufzuheben?

<p>Sie erlauben den Aufruf von Methoden, die den Typparameter in der Parameterliste verwenden. (D)</p> Signup and view all the answers

Betrachten Sie die Klassenhierarchie mit GeoWithExtent, Rectangle und Circle. Was ist der Zweck der Schnittstelle GeoWithExtent?

<p>Sie definiert eine Methode zur Flächenberechnung (<code>area()</code>). (B)</p> Signup and view all the answers

Welche Aussage trifft im Allgemeinen NICHT auf Wildcards in generischen Typen zu?

<p>Sie verhindern jegliche Typkonvertierungen. (B)</p> Signup and view all the answers

Warum sind zwei unterschiedliche Arten von Wildcards notwendig (nach oben und nach unten beschränkt)?

<p>Um unterschiedliche Einschränkungen beim Lesen und Schreiben von Daten zu adressieren. (C)</p> Signup and view all the answers

Angenommen, Sie haben eine LinkedList. Welche der folgenden Operationen könnte problematisch sein, wenn auf die Liste über einen Wildcard-Typ zugegriffen wird?

<p>Ein neues Element zur Liste hinzufügen. (B)</p> Signup and view all the answers

Wie beeinflusst die Verwendung von generischen Typen mit Wildcards die Wiederverwendbarkeit von Code?

<p>Sie erhöht die Wiederverwendbarkeit, da der Code flexibler wird und mit verschiedenen Typen arbeiten kann. (B)</p> Signup and view all the answers

Welche Aussage über die Verwendung der extends-Klausel mit Schnittstellen in generischen Typen ist korrekt?

<p>Die <code>extends</code>-Klausel wird verwendet, um anzugeben, dass ein Typparameter eine bestimmte Schnittstelle implementieren muss. (A)</p> Signup and view all the answers

Welche Aussage beschreibt korrekt den Unterschied zwischen expliziter und automatischer Typbestimmung bei generischen Typen in Java?

<p>Bei expliziter Typbestimmung wird der Typ vom Programmierer explizit angegeben, während der Compiler bei automatischer Typbestimmung den Typ selbstständig ableitet. (D)</p> Signup and view all the answers

Warum ist LinkedList<Point2D> keine Oberklasse von LinkedList<Object>, obwohl Point2D eine Unterklasse von Object ist?

<p>Weil Generics in Java invariant sind, was bedeutet, dass es keine Subtypie-Beziehung zwischen generischen Typen mit unterschiedlichen Typparametern gibt, selbst wenn die Typparameter selbst eine Subtypie-Beziehung haben. (D)</p> Signup and view all the answers

Betrachten Sie den gegebenen Codeausschnitt zur swap-Methode. Was ist das Hauptproblem in der Implementierung von swap?

<p>Die Zuweisung <code>T tmp = arr;</code> kopiert nicht den Inhalt des Arrays, sondern nur die Referenz, was nicht den gewünschten Effekt erzielt. Außerdem soll der letzte Wert mit dem ersten getauscht werden. (A)</p> Signup and view all the answers

Betrachten Sie eine Klasse Accumulator<T extends Number>. Welche Aussage trifft zu?

<p>Der Typparameter <code>T</code> kann jede Klasse sein, die von <code>Number</code> erbt. (C)</p> Signup and view all the answers

Welchen Vorteil bietet die Verwendung einer extends-Klausel bei der Definition generischer Typen?

<p>Sie erlaubt es, den Wertebereich für den Typparameter auf Klassen zu beschränken, die eine bestimmte Oberklasse erweitern oder ein Interface implementieren. (C)</p> Signup and view all the answers

Welchen Vorteil bietet die Verwendung von <T extends Comparable<T>> bei der Definition eines generischen Typs?

<p>Es erlaubt den Vergleich von Objekten des Typs <code>T</code> mit anderen Objekten desselben Typs. (B)</p> Signup and view all the answers

Was bedeutet der Begriff 'Invarianz' im Kontext von Generics in Java?

<p>Es gibt keine Subtypie-Beziehung zwischen generischen Typen mit unterschiedlichen Typparametern, selbst wenn die Typparameter selbst eine Subtypie-Beziehung haben. (D)</p> Signup and view all the answers

Angenommen, Sie möchten eine generische Klasse Rechner<T> erstellen, die nur mit Zahlen (Integer, Double, etc.) verwendet werden kann, um Additionen durchzuführen. Wie würden Sie den Typparameter T einschränken?

<p><code>public class Rechner&lt;T extends Number&gt; { ... }</code> (D)</p> Signup and view all the answers

Warum ist der folgende Code-Schnipsel in Java nicht erlaubt, obwohl Point2D eine Unterklasse von Object ist?

List<Point2D> points = new LinkedList<Point2D>(); List<Object> objects = points;

<p>Weil die Zuweisung von einer <code>List&lt;Point2D&gt;</code> zu einer <code>List&lt;Object&gt;</code> zu Typunsicherheit führen könnte. (A)</p> Signup and view all the answers

Warum ist es sinnvoll, generische Typen in Java zu verwenden, anstatt den Typ Object zu nutzen?

<p>Generische Typen vermeiden <em>type casting</em> und erhöhen die Typsicherheit zur Compile-Zeit, was zu weniger Laufzeitfehlern führt. (A)</p> Signup and view all the answers

Welche der folgenden Aussagen beschreibt am besten, wie Java-Compiler mit generischen Typen umgehen?

<p>Der Compiler löscht die generischen Typinformationen nach der Kompilierung (Type Erasure). (D)</p> Signup and view all the answers

Welche der folgenden Aussagen beschreibt am besten den Zweck der Verwendung einer extends-Klausel in einer generischen Klassendeklaration wie class SortedList<T extends Comparable<T>>?

<p>Sie stellt sicher, dass nur Objekte, die die <code>Comparable</code>-Schnittstelle implementieren, in der <code>SortedList</code> gespeichert werden können, wodurch eine natürliche Ordnung der Elemente gewährleistet wird. (A)</p> Signup and view all the answers

Angenommen, Sie haben eine generische Klasse Container<T>. Warum kann es problematisch sein, eine Methode zu haben, die ein Container<Integer> erwartet, aber stattdessen ein Container<Number> übergeben wird, obwohl Integer eine Unterklasse von Number ist?

<p>Weil <code>Container&lt;Integer&gt;</code> und <code>Container&lt;Number&gt;</code> als komplett unterschiedliche Typen behandelt werden und keine automatische Typkonvertierung stattfindet (Invarianz). (C)</p> Signup and view all the answers

Was passiert, wenn Sie versuchen, eine List<Integer> einer Methode zu übergeben, die eine List<Number> erwartet?

<p>Es führt zu einem Kompilierfehler, da <code>List&lt;Integer&gt;</code> und <code>List&lt;Number&gt;</code> unterschiedliche Typen sind, auch wenn <code>Integer</code> eine Unterklasse von <code>Number</code> ist. (D)</p> Signup and view all the answers

Wie können Sie sicherstellen, dass eine Methode, die eine Liste von Elementen erwartet, sowohl List<Integer> als auch List<Double> akzeptieren kann?

<p>Indem Sie den Typparameter der Methode mit einer Wildcard und einer <code>extends</code>-Klausel einschränken: <code>public void meineMethode(List&lt;? extends Number&gt; liste) { ... }</code> (B)</p> Signup and view all the answers

Flashcards

compareTo() Konvention

Wenn a.compareTo(b) negativ ist, bedeutet das a < b; 0 bedeutet a == b; positiv bedeutet a > b.

Was ist ein Behälter?

Ein generischer Datentyp zur Verwaltung von Mengen von Objekten.

Was macht ein Iterator?

Liefert Elemente eines Behälters in einer bestimmten Reihenfolge.

hasNext()

Prüft, ob noch Elemente in der Aufzählung vorhanden sind.

Signup and view all the flashcards

next()

Gibt das nächste Element der Aufzählung zurück.

Signup and view all the flashcards

remove()

Entfernt das zuletzt mit next() gelieferte Element aus dem Behälter.

Signup and view all the flashcards

remove() ist optional

Kann weggelassen werden; führt ggf. zu einer Ausnahme.

Signup and view all the flashcards

Default remove() Methode

Eine im Interface Iterator implementierte Default-Methode, die eine UnsupportedOperationException wirft.

Signup and view all the flashcards

java.util

Ein Java-Paket, das Algorithmen und Schnittstellen zur Verwaltung von Datenobjekten bietet.

Signup and view all the flashcards

Comparable

Eine Schnittstelle zum Vergleichen von zwei Objekten.

Signup and view all the flashcards

Iterator

Eine Schnittstelle zum Durchlaufen einer Datenstruktur ohne die Implementierung zu kennen.

Signup and view all the flashcards

Interface List

Zentrale Schnittstelle in java.util für Listen, implementiert von ArrayList, LinkedList, usw.

Signup and view all the flashcards

add(E e)

Fügt ein Element zur Liste hinzu.

Signup and view all the flashcards

get(int index)

Gibt das Element an einem bestimmten Index zurück.

Signup and view all the flashcards

subList(int fromIndex, int toIndex)

Gibt eine Teilliste zurück.

Signup and view all the flashcards

Interface Comparable

Schnittstelle für geordnete Daten, schreibt die Methode 'compareTo(T o)' vor. Ergebnis ist vom Typ int.

Signup and view all the flashcards

Was ist Iterable?

Ein Interface, das es einer Klasse erlaubt, in einer for-each-Schleife verwendet zu werden.

Signup and view all the flashcards

Was macht iterator()?

Die iterator()-Methode gibt ein Iterator-Objekt zurück, das zum Durchlaufen der Elemente verwendet wird.

Signup and view all the flashcards

Was ist die Beziehung zwischen List und Iterable?

Die List-Schnittstelle erweitert Iterable und erbt dessen Funktionalität.

Signup and view all the flashcards

Wozu dient die for-each-Schleife?

Die for-each-Schleife vereinfacht das Iterieren über Sammlungen, die Iterable implementieren.

Signup and view all the flashcards

Was sind Java Generics?

Sie ermöglicht das Schreiben von Code, der mit verschiedenen Datentypen arbeiten kann, ohne den Typ explizit angeben zu müssen.

Signup and view all the flashcards

Wo können Generics verwendet werden?

Generics können mit Klassen, Schnittstellen und Methoden verwendet werden.

Signup and view all the flashcards

Wie ist die Syntax für Generics?

Die Typenparameter werden in eckigen Klammern <> nach dem Namen der Klasse oder Schnittstelle angegeben.

Signup and view all the flashcards

Wie viele Typenparameter sind erlaubt?

Es können beliebig viele Typenparameter verwendet werden, aber typischerweise sind es weniger als 3.

Signup and view all the flashcards

Schränkt den generischen Typ auf Klassen ein, die Number erweitern.

Signup and view all the flashcards

Comparable Schnittstelle

Stellt sicher, dass der generische Typ die Comparable-Schnittstelle implementiert.

Signup and view all the flashcards

Extends-Klausel mit Schnittstellen

Die Einschränkung, dass ein Typparameter von einer Schnittstelle erben muss, wird über die extends-Klausel angegeben.

Signup and view all the flashcards

Sortierte Liste

Elemente müssen die generische Schnittstelle Comparable implementieren.

Signup and view all the flashcards

Oberklasse

Die Klasse Object ist Oberklasse von Point2D. Jedoch ist LinkedList keine Oberklasse von LinkedList!

Signup and view all the flashcards

LinkedList Beispiel

List points = new LinkedList(); // funktioniert. List objects = new LinkedList(); // nicht erlaubt.

Signup and view all the flashcards

Polymorphie

Es gibt also keine Polymorphie zwischen den beiden Listen-Klassen.

Signup and view all the flashcards

Neues Konto-Objekt

Methode zum Einfügen eines neuen Konto-Objekts in eine Liste vom Typ LinkedList.

Signup and view all the flashcards

Automatische Typ-Bestimmung

Der Java-Compiler kann oft den Typ für Typparameter selbst bestimmen.

Signup and view all the flashcards

Typangabe bei Instanzerzeugung

Bei der Erzeugung einer Instanz kann der Typ entweder explizit angegeben oder automatisch bestimmt werden.

Signup and view all the flashcards

Typangabe bei Methodenaufruf

Beim Aufruf einer Methode kann der Typ entweder explizit angegeben oder automatisch bestimmt werden.

Signup and view all the flashcards

Einschränkung des Typparameters

Manchmal ist es notwendig, die Typen einzuschränken, die für einen generischen Typ verwendet werden können.

Signup and view all the flashcards

extends-Klausel

Mit dem Schlüsselwort extends kann man fordern, dass ein Typparameter eine bestimmte Klasse erweitert oder eine Schnittstelle implementiert.

Signup and view all the flashcards

Generische Klasse mit extends

Erlaubt die Erstellung einer generischen Klasse, die auf Typen beschränkt ist, die die Schnittstelle Comparable implementieren.

Signup and view all the flashcards

Typparameter-Einschränkung

Begrenzt die Typen, die für einen generischen Typ verwendet werden können, indem gefordert wird, dass sie eine bestimmte Schnittstelle implementieren.

Signup and view all the flashcards

Eingeschränkter generischer Typ

Eine generische Klasse oder Methode, bei der der Typparameter auf einen bestimmten Typ beschränkt ist.

Signup and view all the flashcards

Wildcard-Typ

Ein Typ, der verwendet wird, um mit unbekannten generischen Typen zu arbeiten.

Signup and view all the flashcards

Einschränkung bei Wildcards

Eine Methode, die keine Elemente hinzufügen darf, wenn sie einen Wildcard-Typ verwendet.

Signup and view all the flashcards

Object und LinkedList

Obertyp für alle generischen LinkedList-Klassen.

Signup and view all the flashcards

Ergebnis-Typ bei LinkedList

Typparameter der LinkedList als Ergebnis -> Ergebnis gehört zur Klasse Object.

Signup and view all the flashcards

Methodenaufruf-Einschränkung

Aufruf einer Methode von LinkedList unmöglich, in der die Parameterliste den Typparameter verwendet.

Signup and view all the flashcards

Oben beschränkte Wildcards

Ermöglicht eingeschränkte Typen für Wildcards nach oben.

Signup and view all the flashcards

Unten beschränkte Wildcards

Hebt die Einschränkung bei Methodenaufrufen mit Typparametern auf.

Signup and view all the flashcards

GeoWithExtent

Eine Schnittstelle mit einer Methode zur Flächenberechnung.

Signup and view all the flashcards

Study Notes

Generische Klassen und Schnittstellen der Java API

  • Das Paket java.util bietet Algorithmen, Klassen und Schnittstellen für die effiziente Verwaltung von Mengen beliebiger Datenobjekte.
  • Typische Beispiele sind Listen, Suchbäume und Sortierverfahren.
  • Wichtige generische Schnittstellen sind Comparable und Iterator.
  • Comparable ermöglicht den Vergleich von zwei Objekten.
  • Iterator ermöglicht den Durchlauf durch eine Datenstruktur unabhängig von der konkreten Implementierung.

Interface List<E>

  • List<E> ist eine zentrale Schnittstelle in java.util.
  • Es hat Ober-Interfaces wie Iterable<E>.
  • Die Schnittstelle List wird von Klassen wie ArrayList<E>, LinkedList<E> und SortedList<E> implementiert.
  • Wichtige Methoden im Interface List sind add(E e) (boolean), get(int index) (E) und subList(int fromIndex, int toIndex) (List<E>).

Tipps zum Umgang mit Interfaces

  • Für Datenstrukturen wird empfohlen, Interfaces als Typ von Variablen/Parametern zu verwenden.
  • Interfaces haben verschiedene Implementierungen mit unterschiedlichen "nicht-funktionalen" Eigenschaften.
  • Algorithmen sollten meist unabhängig von "nicht-funktionalen" Eigenschaften sein.
  • Beispiel für eine generische Methode, die eine List als Parameter akzeptiert: public void sort(List<E> l).
  • ArrayList ist schnell beim Zugriff über den Index.
  • LinkedList ist schnell beim Anfügen an den Anfang.

Interface Comparable<T>

  • Das Interface Comparable<T> wird für geordnete Daten verwendet.
  • Es schreibt die Methode int compareTo(T o) für Objekte o vom Typ T vor.
  • Die compareTo-Methode gibt einen Integer-Wert zurück, der die Beziehung zwischen zwei Objekten angibt.
  • Eine Konvention ist, dass ein negativer Wert a < b bedeutet, 0 bedeutet a == b, und ein positiver Wert bedeutet a > b.

Interface Iterator<E>

  • Ein Behälter ist ein generischer Datentyp zur Verwaltung von Mengen beliebiger Objekte.
  • Listen dienen nur als Beispiel für einen Behälter.
  • Ein Iterator liefert in einer spezifischen Reihenfolge die Elemente eines Behälters.
  • hasNext() liefert true, wenn es noch Elemente im Behälter gibt.
  • next() produziert das nächste Element der Aufzählung.
  • remove() entfernt das zuletzt mit next() abgelieferte Element aus dem Behälter (optional).

Beispiel: Ein Iterator für Listen

  • Es existiert eine remove()-Methode als Standardmethode im Interface Iterator.
  • Es wird eine UnsupportedOperationException ausgelöst

Interface Iterable<E>

  • Listen können wie Arrays mit einer for-each-Schleife durchlaufen werden.
  • Voraussetzung ist, dass die Liste das generische Interface Iterable<E> implementiert.
  • Die Schnittstelle List erweitert die Schnittstelle Iterable.
  • Die Klasse LinkedList implementiert die Methode.

Anwendung der for-each Schleife

  • Da die Klasse LinkedList die Schnittstelle Iterable implementiert, kann der Durchlauf mit einer for-each-Schleife erfolgen.
  • Die for-each-Schleife kann für alle Klassen, die Iterable implementieren, verwendet werden, ähnlich wie bei Arrays.

Java Generics im Detail

  • Es werden weitere Details von Java Generics behandelt.
  • Bisher wurden am Beispiel von Listen wichtigsten Konzepte generischer Klassen erläutert.

Syntax

  • Java Generics unterstützen die Parametrisierung mit Typen bei Klassen, Schnittstellen und Methoden.
  • Anzahl der Parameter ist beliebig, typischerweise aber kleiner als 3.
  • Die Parameterliste wird in eckigen Klammern "<...>" angegeben.
  • Bei Klassen und Schnittstellen folgt die Angabe nach dem entsprechenden Namen.
  • Parameter werden durch Kommata getrennt.

Beschränkungen

  • Keine primitiven Typen als Argument für Typparameter.
  • Keine Aufrufe von Konstruktoren des Typparameters T.
  • Keine Aufrufe statischer Methoden des Typparameters T.
  • Keine Verwendung des Typparameters T in der Definition von statischen Methoden oder statischen Felddeklarationen.
  • Keine Allokation eines Arrays vom Typparameter T.
  • Implizite Typumwandlungen sind beim Hinzufügen von primitiven Datentypen in eine Liste von Wrapper-Klassen möglich.

Generische Methoden

  • Objektmethoden dürfen Typparameter der Klasse verwenden.
  • Java erlaubt sowohl statischen als auch Objektmethoden, eigene Typparameter zu deklarieren.
  • Die Liste der generischen Typen wird vor dem Rückgabetyp der Methode angegeben.

Automatische Typ-Bestimmung

  • Der Java-Compiler kann den Typ für Typparameter oft selbst bestimmen.
  • Dies gilt sowohl bei der Erzeugung einer Instanz als auch beim Aufruf einer Methode wo es eine explizite Typangabe.

Einschränkung des Typparameters

  • Bisher wurden beliebige Typen bei der Instanziierung generischer Typen erlaubt.
  • In bestimmten Fällen werden jedoch gewisse Eigenschaften von Typen gefordert.
  • Eine sortierte Liste sollte z.B. nur mit Typen instanziiert werden, die das Interface Comparable unterstützen.

extends-Klausel

  • Bei einer generischen Klasse kann eine Eigenschaft für einen Typparameter durch Angabe des Schlüsselworts extends und einer Klasse oder Schnittstelle gefordert werden.
  • Die Klasse Number aus der Java API ist die Oberklasse von Klassen wie Integer oder Double.

extends-Klausel mit Schnittstellen

  • Um eine Ordnung in einer Liste sicherzustellen, sollte der generische Typ die Schnittstelle Comparable unterstützen.
  • Die Einschränkung, dass ein Typparameter von einer Schnittstelle erben muss, wird ebenfalls über die extends-Klausel angegeben.

Wildcards – Motivation (1)

  • Bei den Möglichkeiten in Generics gibt es Probleme.
  • Die Klasse Object ist Oberklasse von Point2D.
  • LinkedList<Object> ist keine Oberklasse von LinkedList<Point2D>.
  • Es gibt keine Polymorphie zwischen den beiden Listen-Klassen.

Warum ist es nicht erlaubt?

  • Eine Methode zum Einfügen eines neuen Konto-Objekts in eine Liste vom Typ LinkedList<Object>.
  • Der Aufruf der Methode mit einem Parameter vom Typ LinkedList<Point2D> sollte verhindert werden, da Konto keine Unterklasse von Point2D ist.

Warum sollte es erlaubt sein?

  • Es soll eine Methode bereitgestellt werden, um eine beliebige Liste auszugeben, aber dem ist es nicht erlaubt!
  • Die Methode verändert die Liste gar nicht.

Wildcard-Typ

  • Durch Verwendung eines Wildcard-Typs wird das Problem behoben.
  • Einschränkungen bei Verwendung des Wildcard-Typs als Typargument: In der Methode dürfen wir nicht die Methode add aufrufen.
  • Der Typparameter der generischen LinkedList<?> ist unbekannt.

Beziehung zwischen Klassen

  • Durch LinkedList<?> wird ein Obertyp für alle LinkedList-Klassen zur Verfügung gestellt.
  • Einschränkungen: Wenn Methoden den Typparameter der LinkedList<?> als Ergebnis liefern, können wir nur davon ausgehen, dass das Ergebnis zur Klasse Object gehört.
  • Es darf kein Aufruf einer Methode von LinkedList<?> erfolgen, in der die Parameterliste den Typparameter verwendet.
  • Die erste Einschränkung kann durch nach oben beschränkte Wildcards gelockert, die zweite wird durch nach unten beschränkte Wildcards aufgehoben werden.

Motivation für oben beschränkte Wildcards

  • Es wird eine Klassenhierarchie mit einem Interface GeoWithExtent, das von Rectangle und Circle implementiert wird, betrachtet.
  • Ziel ist es, eine generische Methode bereitzustellen, die für alle drei Listen die Summe der Flächeninhalte der Objekte berechnet.

Obere Schranke für Wildcards

  • Die obere Schranke für Wildcards kann mit Hilfe des extends Schlüsselworts.
  • Diese Methode kann für alle Listen parametrisiert mit einer Unterklasse von GeoObjectsWithExtent verwendet werden.

Motivation für unten beschränkte Wildcards

  • Es wird die Klassenhierarchie mit dem Interface GeoWithExtent betrachtet
  • Die Klasse Circle soll double getRadius() Methode besitzen
  • Wenn ja wie können wir das in Java unterstützen?

Beispiel 1/2: Unbeschränkte/beschränkte Wildcards

  • Die Methode "getAllRadii" liest ein Element von der Liste und erwartet dass es dem Typ Circle entspricht
  • Die Liste von GeoWithExt wird mit einem Rechteck befüllt.
  • Hier kommt es zu einer Fehlermeldung, da wir eine Geometrie ohne Radius haben

Untere Schranke

  • Damit der Compiler diese Programme akzeptiert es wird super <Klasse> verwendet.
  • Dadurch sind nur Unterklassen und die Klasse selbst möglich.
  • Auch hier ist nur ein lesender Zugriff möglich.

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

More Like This

Untitled
110 questions

Untitled

ComfortingAquamarine avatar
ComfortingAquamarine
Untitled Quiz
6 questions

Untitled Quiz

AdoredHealing avatar
AdoredHealing
Untitled
44 questions

Untitled

ExaltingAndradite avatar
ExaltingAndradite
Untitled
53 questions

Untitled

ProperMahoganyObsidian avatar
ProperMahoganyObsidian
Use Quizgecko on...
Browser
Browser