Verstehen des Verhaltens von Rohtypen mit generischen Methoden
Bei der Arbeit mit Java-Generika ist es wichtig, die Auswirkungen der Verwendung von Rohtypen zu verstehen und ihre Auswirkungen auf generische Methoden. Lassen Sie uns in ein bestimmtes Codebeispiel eintauchen und untersuchen, wie sich Rohtypen auf die Methodenauflösung auswirken.
Betrachten Sie den folgenden Codeausschnitt, in dem eine ArrayList von Strings erstellt und in ein Array konvertiert wird:
ArrayList<String> a = new ArrayList<String>(); String[] s = a.toArray(new String[0]);
Wie erwartet lässt sich dieser Code in Java 1.6 und 1.7 erfolgreich kompilieren. Wenn die ArrayList-Referenz jedoch als Rohtyp deklariert ist, tritt beim Kompilieren ein Fehler auf:
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]); // Error: Argument required String[] found Object[]
In diesem Szenario interpretiert der Compiler die generische Methode toArray(myArray) als Rückgabe eines Object[] trotz Empfang ein String[] als Argument. Dieses Verhalten ist ziemlich unerwartet, da die Methodensignatur eindeutig einen Typparameter
Um dies zu verstehen, betrachten wir Abschnitt 4.8 der Java Language Specification (JLS). Darin heißt es: „Der Typ einer Instanzmethode M eines Rohtyps C, der nicht von seinen Superklassen oder Superschnittstellen geerbt wird, ist der Rohtyp, der der Löschung seines Typs in der generischen Deklaration entspricht, die C entspricht.“
Im Wesentlichen verwirft der Compiler bei Verwendung eines Rohtyps im Wesentlichen alle Typinformationen und lässt nur die Rohdarstellung der Klasse übrig. Dies bedeutet, dass in unserem Beispiel die toArray-Methode effektiv zu einer nicht generischen Methode mit einem Object[]-Rückgabetyp wird, obwohl sie ursprünglich als generische Methode definiert wurde.
Dieser Verlust der Generizität in Rohtypen hat wichtige Auswirkungen:
Es wird allgemein empfohlen, die Verwendung von Rohtypen zu vermeiden und sich stattdessen für Typsicherheit und Flexibilität auf Generika zu verlassen. Das Verständnis des Verhaltens von Rohtypen kann Ihnen jedoch dabei helfen, Probleme zu beheben und fundierte Entscheidungen in bestimmten Szenarien zu treffen.
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von Rohtypen mit generischen Methoden zu unerwartetem Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!