Kombination von Rohtypen und generischen Methoden: Unvorhergesehene Konsequenzen
Beim Umgang mit Rohtypen und generischen Methoden kann es zu unerwartetem Verhalten kommen. Betrachten Sie den folgenden Codeausschnitt:
ArrayList<String> a = new ArrayList<String>(); String[] s = a.toArray(new String[0]);
Dieser Code wird sowohl in JDK 1.6 als auch 1.7 erfolgreich kompiliert. Das Ändern der ArrayList-Referenz auf einen Rohtyp führt jedoch zu einem Compilerfehler:
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]); // Error: String[] expected, Object[] found
Überraschenderweise interpretiert der Compiler die generische Methode toArray als Rückgabe von Object[], obwohl er einen String[] als Argument erhält. Dies ist kontraintuitiv, da man erwarten würde, dass die Methode ihren Typparametern entspricht.
Verstehen des Verhaltens
Das JLS 4.8 beleuchtet dieses Verhalten:
"Der Typ eines Konstruktors, einer Instanzmethode oder eines nicht-statischen Felds M eines Rohtyps C, der nicht von seinen Superklassen oder Superschnittstellen geerbt wird, ist der Rohtyp, der der Löschung seines Typs in der entsprechenden generischen Deklaration entspricht zu C.“
Einfacher ausgedrückt: Beim Umgang mit Rohtypen ignoriert der Compiler alle Typparameter, die mit Methoden oder Feldern verknüpft sind. Daher ist der Typ der toArray-Methode im Rohtyp ArrayList Object[], unabhängig vom Typparameter T.
Dieses Verhalten geht über generische Methoden hinaus. Selbst wenn Sie Generika in anderen Teilen der Klasse verwenden, macht die Bezeichnung als Rohtyp die Verwendung von Generika innerhalb dieser Instanz praktisch zunichte. Dieser Code generiert beispielsweise eine ungeprüfte Warnung:
public class MyContainer <T> { public List<String> strings() { return Arrays.asList("a", "b"); } } MyContainer container = new MyContainer<>(); List<String> strings = container.strings(); // Unchecked warning
Schlussfolgerung
Beim Umgang mit Rohtypen und generischen Methoden ist es wichtig zu verstehen, dass ein Rohtyp verwendet wird Typ deaktiviert die Verwendung von Generika für diese bestimmte Instanz. Stellen Sie sicher, dass Sie Rohtypen mit Bedacht verwenden, da diese zu verwirrendem und unerwartetem Verhalten führen können.
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung eines Rohtyps mit einer generischen Methode in Java zu unerwartetem Typverhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!