Hallo. Es ist Kecho. ** Benutzt ihr Generika? ** ** ** Ich habe heute zum ersten Mal gelernt. Ich meine, ich hatte es noch nie gesehen, aber ich bin endlich auf einen Ort gestoßen, an dem ich lernen konnte.
Ich denke, derjenige, den ich am meisten treffe, ist die Liste. Ich denke, Sie haben die folgende Erklärung abgegeben.
List<String> list = new ArrayList<>();
Ich wusste nur, dass es sich um ein Array mit variabler Länge handelt. Klassen, die dieses <> verwenden, werden als generische Klassen bezeichnet.
List<String> list
Zuallererst dieser Teil. List ist eine Schnittstelle, die in erster Linie mehrere Elemente wie ein Array ** enthält und behandelt. Es sind nicht nur Zeichenfolgen, sondern auch verschiedene Arten von Objekten gespeichert. (Nur ein Typ.) Die obige Deklaration sieht also vor, dass String dieses Mal gespeichert wird.
new ArrayList<>();
Weiter dieser Teil. Das <> ist leer, aber ich lasse es einfach weg. (Der Typ kann aus der Zeichenfolge auf der linken Seite abgeleitet werden.)
Lassen Sie uns Generika aus einer breiteren Perspektive betrachten, nicht nur die Liste. Die einfache Definition lautet wie folgt.
public class Gene<T> {
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
Die Verwendung ist wie folgt
Gene<String> g1 = new Gene<>(); //Mit String-Typ behoben
Gene<Integer> g2 = new Gene<>(); //Als Integer-Typ behoben
g1.setT("test");
System.out.print(g1.getT()); // test
g2.setT(24);
System.out.print(g2.getT()); // 24
In diesem Beispiel konnten wir mehrere Klassen für dieselbe Klasse verwenden.
public class GeneObj {
Object t;
public void setT(Object t) {
this.t = t;
}
public Object getT() {
return t;
}
}
Ich habe versucht, die Object-Klasse für das Teil zu verwenden, das durch Typ T begrenzt war. Lass es uns benutzen.
GeneObj g1 = new GeneObj();
GeneObj g2 = new GeneObj();
g1.setT("test");
System.out.print(g1.getT()); // test
g2.setT(24);
System.out.print(g2.getT()); // 24
Sie könnten es mit ähnlichem Code schreiben.
Muss ich Generika verwenden? ?? ??
Beide funktionieren in diesem Beispiel, es gibt jedoch ein Problem bei der Verwendung von Object. Einfach ausgedrückt ist diese Klasse umständlich zu verwenden.
GeneObj g1 = new GeneObj(); //Mit String-Typ behoben
g1.setT("1");
Integer res = (Integer) g1.getT() + 1; //Auftreten von ClassCastException
System.out.print(res);
Oben habe ich versehentlich einen String anstelle eines Integer-Typs gepackt. Daher trat beim Casting in die Integer-Klasse eine ClassCastException auf. Aus Sicht des Benutzers muss er den Typ kennen, den er gesetzt hat. Dies ist eine Brutstätte für Fehler. ** Bei Generics müssen Sie zunächst keine Besetzung verwenden, und Sie können dies mit einem Kompilierungsfehler feststellen. ** ** **
Generika werden benötigt, um die Flexibilität des Typs und die Wartbarkeit des Codes in Einklang zu bringen
Recommended Posts