Lernpfad:Objektorientierte Programmierung mit Java/Generische Typen: Unterschied zwischen den Versionen

Aus Informatik-Box
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „{{Navigation}} == Generische Typen und Klassen == Ein {{Pfad|Datentypen und Variablen|Datentyp}} bestimmt die Art der Informationen, die in einer Variablen ges…“)
 
Keine Bearbeitungszusammenfassung
Zeile 39: Zeile 39:
Eine Einschränkung generischer Typen ist, dass sie konkret nicht mit einem der primitiven Datentypen (<code>int</code>, <code>boolean</code>, ...) belegt werden können. Folgendes geht also nicht:
Eine Einschränkung generischer Typen ist, dass sie konkret nicht mit einem der primitiven Datentypen (<code>int</code>, <code>boolean</code>, ...) belegt werden können. Folgendes geht also nicht:
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
Kiste<int> zahlA = new Kiste<int>(4);
Kiste<int> zahlA = new Kiste<int>(4); // Fehler !!!
Kiste<int> zahlB = new Kiste<int>(6);
System.out.println(zahlA.getInhalt() + 6);
System.out.println(zahlA.getInhalt() + zahlB.getInhalt());
</syntaxhighlight>
</syntaxhighlight>


Zeile 47: Zeile 46:
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
Kiste<Integer> zahlA = new Kiste<Integer>(4);
Kiste<Integer> zahlA = new Kiste<Integer>(4);
Kiste<Integer> zahlB = new Kiste<Integer>(6);
System.out.println(zahlA.getInhalt() + 6); // Gibt aus: 10
System.out.println(zahlA.getInhalt() + zahlB.getInhalt());
</syntaxhighlight>
</syntaxhighlight>



Version vom 13. November 2018, 18:19 Uhr

Generische Typen und Klassen

Ein Datentyp bestimmt die Art der Informationen, die in einer Variablen gespeichert werden können. Dieser Typ muss bei der Deklaration der Variablen strikt festgelegt werden.

int zahl = 0;
String text = "Hallo, Welt!"

Manchmal weiß man bei der Implementierung einer Klasse aber noch nicht, welchen Datentypen alle Objektvariablen haben sollen, oder es ist wünschenswert, eine Klasse so zu implementieren, dass sie verschiedene Datentypen aufnehmen kann (Datenstrukturen sind ein solches Beispiel).

Um dies zu erlauben gibt es in Java Generische Klassen, die Generische Datentypen verwenden.

Generische Typen werden erst konkret festgelegt, wenn eine neue Objektinstanz einer Klasse erstellt wird. Bei der Implementierung benutzt man noch einen Platzhalter.

public class Kiste<Inhaltstyp> {
  private Inhaltstyp inhalt;

  public Kiste( Inhaltstyp pInhalt ) {
    inhalt = pInhalt;
  }

  public Inhaltstyp getInhalt() {
    return inhalt;
  }

  public void setInhalt( Inhaltstyp pInhaltNeu ) {
    inhalt = pInhaltNeu;
  }
}

Die Klasse Kiste oben ist eine generische Klasse mit dem generischen Typ Inhaltstyp . Er wird durch die Spitzen Klammern (<>) gekennzeichnet. Der generische Typ wird wie jeder andere Typ verwendet (zum Beispiel bei der Deklaration der Objektvariablen inhalt oder im entsprechenden Getter und Setter), ohne das es diesen Typ in Java gibt. Möchte man nun ein Objekt der Klasse Kiste erstellen, dann muss man den konkreten Typ des Inhalts mit angeben:

Kiste<String> eineKisteVollText = new Kiste<String>("Hallo, Welt!");
System.out.println(eineKisteVollText.getInhalt()); // Gibt aus: Hallo, Welt!

Wrapper-Klassen

Eine Einschränkung generischer Typen ist, dass sie konkret nicht mit einem der primitiven Datentypen (int, boolean, ...) belegt werden können. Folgendes geht also nicht:

Kiste<int> zahlA = new Kiste<int>(4); // Fehler !!!
System.out.println(zahlA.getInhalt() + 6);

Die konkreten Typen müssen immer komplexe Datentypen (also Klassen) sein. Um dennoch Zahlen oder Wahrheitswerte benutzen zu können, gibt es in Java Wrapper-Klassen (dt. Hülle) für jeden primitiven Typ. Für den primitiven Typ int ist dies zum Beispiel Integer. Damit kann das Programm oben so umgesetzt werden:

Kiste<Integer> zahlA = new Kiste<Integer>(4);
System.out.println(zahlA.getInhalt() + 6); // Gibt aus: 10
Icon Info.png

Man würde erwarten, dass der Kiste als Inhalt auch eine Objektinstanz der Klasse Integer übergeben werden müsste. Dies ist auch der Fall, allerdings hilft Java hier aus, indem der Compiler die 4 implizit in ein new Integer(4) umwandelt.