Wenn ich Ihnen direkt sagen würde, was Generika sind, kann ich das wirklich nicht. Hier ist eine Frage:
Definieren Sie eine Koordinatenpunktklasse, die verschiedene Datentypen speichern kann, z. B. Ganzzahlen, Gleitkommatypen und Zeichenfolgentypen.
Da der Variablentyp zunächst unsicher ist, kann man sich leicht vorstellen, stattdessen die übergeordnete Klasse aller Typen, also die Object-Klasse, zu verwenden.
Kein Unsinn mehr, verwenden Sie Code, um ihn wiederzugeben
Beispiel 1: Verwenden Sie Object, um die Eingabe unsicherer Datentypen zu implementieren
//Objekt zur Darstellung unsicherer Typen verwenden
öffentlicher Punkt(Objekt x, Objekt y) {
this.setX(x);
this.setY(y);
}
public void setX(Object x) {
this.x = x;
}
öffentliches Objekt getX() {
x zurückgeben;
}
public void setY(Object y) {
this.y = y;
}
öffentliches Objekt getY() {
y zurückgeben;
}
}
//Testklasse
Demo der öffentlichen Klasse {
public static void main(String[] args) {
System.out.println("Verwenden Sie Gleitkommazahlen zur Darstellung von Koordinaten:");
Punkt p = neuer Punkt(12.23,23.21);
//Hier wird die Object-Klasse in die Double-Klasse konvertiert und dann automatisch entpackt. Die folgenden beiden sind gleich.
System.out.println("X-Koordinaten" + (Double)p.getX());
System.out.println("Y-Koordinaten" + (Double)p.getY());
System.out.println();
System.out.println("Ganzzahlen zur Darstellung von Koordinaten verwenden: ");
Punkt p2 = neuer Punkt(12, 23);
System.out.println("Koordinaten von X" + (Integer)p2.getX());
System.out.println("Y-Koordinaten" + (Integer)p2.getY());
System.out.println();
System.out.println("Koordinaten als String darstellen: ");
Punkt p3 = neuer Punkt("29 Grad nördlicher Breite", "113 Grad östlicher Länge");
System.out.println("X-Koordinaten" + (String)p3.getX());
System.out.println("Y-Koordinaten" + (String)p3.getY());
}
}
Sie müssen genau verstehen, welchen Typ Sie übergeben, und ihn dann herunterspielen, bevor Sie ihn verwenden können.
Obwohl dies der Nachfrage entspricht, impliziert es auch einen unsicheren Faktor. Warum soll es implizit sein?
Beispielsweise verwenden wir new Point(12.23, „29 Grad nördlicher Breitengrad“), um ein Point-Objekt zu erstellen
Verwenden Sie dann (Double), um es nach unten zu transformieren. Was wird das Ergebnis sein?
Ja, die Kompilierung wird erfolgreich sein, aber nach der Ausführung tritt eine Typkonvertierungsausnahme auf
Es ist auch sehr einfach, Ausnahmen bei der Klassenkonvertierung zu vermeiden. Ersetzen Sie einfach die Objektdeklaration durch eine feste Typdeklaration (z. B. String x, String y), sodass beim Kompilieren ein Fehler gemeldet wird.
Dann können Sie die Fehler finden und Korrekturen vornehmen
Aber dann können wir die Nachfrage nicht decken.
Um Sicherheitsrisiken zu vermeiden und verschiedene Datentypen zu ersetzen, haben diese talentierten Leute das Konzept der Generika in JDK1.5 eingeführt
Sehen wir uns an, wie man den obigen Code mithilfe von Generika umschreibt
Beispiel 2: Generische Klasse
Demo der öffentlichen Klasse {
public static void main(String[] args) {
System.out.println("Verwenden Sie Gleitkommazahlen zur Darstellung von Koordinaten:");
// Nach dem Umschreiben mit Generika ist keine Abwärtstransformation der verwendeten Daten erforderlich.
Point<Double> p = new Point<Double>(12.23,23.21);
System.out.println("X-Koordinaten" + p.getX());
System.out.println("Y-Koordinaten" + p.getY());
System.out.println();
System.out.println("Ganzzahlen zur Darstellung von Koordinaten verwenden: ");
Point<Integer> p2 = new Point<Integer>(12, 23);
System.out.println("X-Koordinaten" + p2.getX());
System.out.println("Y-Koordinaten" + p2.getY());
System.out.println();
System.out.println("Koordinaten als String darstellen: ");
Point<String> p3 = new Point<String>("29 Grad nördlicher Breitengrad", "113 Grad östlicher Längengrad");
System.out.println("X-Koordinate" + p3.getX());
System.out.println("Y-Koordinaten" + p3.getY());
}
}
Wenn wir zu diesem Zeitpunkt bewusst verschiedene Datentypen übergeben:
Point<Double> p = new Point<Double>("29 Grad nördlicher Breite",12.22);
Dann wird beim Kompilieren ein Fehler gemeldet
Obwohl Generika definiert sind, werden die Daten als Objekt behandelt, wenn Sie den generischen Mechanismus im Konstruktor nicht verwenden.
Der Zweck besteht hauptsächlich darin, mit alten Codes vor JDK1.4 kompatibel zu sein, z
Punkt p = neuer Punkt(22.11,23.21);
Das endgültige Ausführungsergebnis ist dasselbe, es wird jedoch während der Kompilierung eine Warnmeldung angezeigt.
Beispiel 3: Generische Methoden
Wie Sie dem obigen Beispiel entnehmen können, wird nach der Angabe des Objekttyps im Konstruktor derselbe Typ in der gesamten Klasse verwendet
Das typischste Beispiel wird im Sammlungsframework verwendet, z. B.: ArrayList<Integer> al = new ArrayList<Integer>();
Zu diesem Zeitpunkt sind alle in al betriebenen Objekttypen Ganzzahlen.
Manchmal möchten wir jedoch nicht den Betriebsgegenstand festlegen, sondern generische Technologie flexibler nutzen.
Zu diesem Zeitpunkt können Sie die generische Methode ausprobieren
public <E> void show(E e) {
System.out.println(e);
}
}
Demo der öffentlichen Klasse {
public static void main(String[] args) {
Drucken p = new Print();
p.print(12);
p.print("Hallo");
p.show(new Integer(33));
p.show(23);
}
}
Tatsächlich gibt es auf diese Weise keinen großen Unterschied zur Verwendung von Object-Objekten in Methoden.
Darüber hinaus wurde nach JDK1.5 die automatische Unboxing-Funktion hinzugefügt, sodass keine Abwärtstransformation erforderlich ist.
Beispiel 4: Generische Schnittstelle
//Implementierungsmethode eins:
Klasse InterDemo1 implementiert Inter<String> {
public void print(String t) {
System.out.println("print: " + t);
}
}
//Implementierungsmethode zwei:
Klasse InterDemo2<T> implementiert Inter<T> {
public void print(T t) {
System.out.println("print: " + t);
}
}
Klassendemo {
public static void main(String[] args) {
InterDemo1 id1 = new InterDemo1();
id1.print("Hallo");
InterDemo2<Integer> id2 = new InterDemo2<Integer>();
id2.print(new Integer(23));
}
}
Es gibt zwei Möglichkeiten, eine generische Schnittstelle zu implementieren. Eine besteht darin, den generischen Typ bei der Implementierung anzugeben.
Die andere besteht darin, weiterhin Generika zu verwenden und den generischen Typ während der Konstruktion zu bestimmen.