Bei der Arbeit mit Generika in Java ist es wichtig, die Auswirkungen der Verwendung von Rohtypen zu verstehen. Ein Rohtyp ist einfach ein Verweis auf einen generischen Typ ohne Angabe von Typparametern.
Das Problem
Betrachten Sie den folgenden Code:
ArrayList<String> a = new ArrayList<>(); String[] s = a.toArray(new String[0]);
Dieser Code lässt sich erfolgreich kompilieren, da toArray eine generische Methode ist, die ein Array vom Typ
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]);
Der Compiler generiert einen Fehler, der darauf hinweist, dass ein String[] erforderlich ist, aber ein Object[] gefunden wurde. Dies liegt daran, dass der Compiler die generische Methode so interpretiert, dass sie Object[] zurückgibt, obwohl sie String[] als Argument erhält.
Rohtypen verstehen
Um dieses Verhalten zu verstehen, ist es Es ist wichtig, sich darüber im Klaren zu sein, dass Sie bei der Verwendung eines Rohtyps die Möglichkeit verlieren, Typparameter anzugeben. Die Java Language Specification (JLS) besagt für einen Rohtyp:
„Der Typ eines Konstruktors, einer Instanzmethode oder eines nicht-statischen Feldes 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.“
Mit anderen Worten: Alle generischen Methoden und Felder innerhalb eines Rohtyps werden so behandelt, als wären sie mit Rohtypen deklariert worden selbst.
Implikationen für generische Methoden
Das bedeutet, dass der Compiler den Typparameter von nicht ableiten kann, wenn Sie einen Rohtyp als Ziel eines generischen Methodenaufrufs verwenden die Methode. Daher wird davon ausgegangen, dass die Methode nur für den Typparameter des Arguments generisch ist. Da wir in unserem Fall ein String[]-Argument übergeben haben, wird die toArray-Methode als
Referenzen zur weiteren Lektüre
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von Rohtypen mit generischen Methoden zu Typfehlern in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!