Mir sind generische Typen nicht klar.
Manchmal schreibt man Klassenname<T> name_der_Variable bsp in einer Funktion als Übergabeparameter.
und dann wiederum gibt es Funktionen
public static <T> Name_der_Klasse<T> Name_Der_funktion()
Dann wiederrum schreibt man <HashSet<Klassenname<T>>
Was ist zwischen den dreien der Unterschied?
Das T so verstehe ich das gibt einen Typen wieder in dem ich alles einsetzen kann, Häuser, int, aber ebenso auch Strings.
Generics dienen dazu
- mehr Bugs zu finden während der Compilerzeit
Generics add stability to your code by making more of your bugs detectable at compile time
Warum Generics?
- um den selben Code nochmal für andere Dinge zu verwenden und nicht alles neu schreiben müssen bei verschiedenen Inputsachen
- bessere Typsicherheit( hab ich Schuhe und Autos, dann kann ich nur Schuhe oder Autos in eine Methode stecken)
- man hat keine Casts
- Code ist leichter zu lesen
Eine generische Klasse wird folgendermassen aufgebaut:
public class<T1,T2,Tn> { }
// Damit kann ich T1, T2,Tn überall in der Klasse verwenden
Die Parameter haben spezielle Namen:
E Element
K Schlüssel
N Nummer
T Typ
V Wert
(Prinzipiell kann ich aber auch ein X reinschreiben für ein Element oder? Es ist nur konform dass man es so macht?)
Versteh ich das Richtig, <T> ist ein Typparameter, <String> aber ein Typargument?
> sowie < Operationen oder auch == vergleich mit Comparable, da <,=,> nur bei primitiven Datentypen funktioniert.
Nicht per se. Der Unterschied zwischen einem Typparameter und einem Typargument ist so ziemlich derselbe wie bei einem formalen Methodenparameter und einem aktuellen Methodenargument. Das eine dient als Platzhalter bei der Deklaration und das andere bei der tatsächlichen Instanziierung bzw. Konkretisierung einer typparametrierten Klasse oder Methode.
Wenn man das Ganze etwas weiterspinnt und in die Typtheorie abdriftet, dann sind parametrisierte Typen im Grunde genommen nichts anderes als Funktionen, die einen Typ (einen generischen Typ) auf einen neuen konkreten Typen abbilden. Genauso wie Methoden quasi Funktionen auf konkreten Werten sind, sind generische Typen und die Instanziierung/Konkretisierung dieser Typen mit Typargumenten dann halt Funktionen auf Typen.
Ein Beispiel, wo <T> sowohl ein Typparameter als auch ein Typargument ist, ist:
Java:
publicclassMyOwnList<T>implementsList<T>{...}
Hier ist das <T> an MyOwnList ein Typparameter und das <T> an List ein Typargument.
Es darf kein primitiver Typ sein (also gerade nicht z. B. int, boolean, etc. Die Wrapper-Klassen wie Integer, Boolean können aber natürlich verwendet werden)
Un es wird keine Liste vom Typ T erwartet, sondern MyOwnList<T> implementiert das List-Interface für Typ T.
Die primitiven Datentypen von Java sind Schlüsselwörter der Sprache: boolean, byte, short, char, int, long, float, double. Instanzen der primitiven Datentypen sind einfache Werte (keine Objekte) und können in Java nicht unmittelbar referenziert werden. Die Wrapper-Klassen (java.lang.Integer & Co) sind die objekt-orientierten Pendants zu den primitiven Typen und erlauben die Darstellung primitiver Werte als Objekte.