Heim  >  Artikel  >  Java  >  Warum führt die Verwendung von Rohtypen mit generischen Methoden zu Typfehlern in Java?

Warum führt die Verwendung von Rohtypen mit generischen Methoden zu Typfehlern in Java?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-12 00:10:03587Durchsuche

Why does using raw types with generic methods lead to type errors in Java?

Kombinieren von Rohtypen und generischen Methoden

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 als sein Argument. Wenn die ArrayList-Referenz jedoch als Rohtyp deklariert ist:

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 behandelt. Daher ist der Rückgabetyp T[], was String[] entspricht.

Referenzen zur weiteren Lektüre

  • [JLS 4.8: Rohtypen ](https://docs.oracle.com/javase/specs/jls/se17/html/jls-4.html#jls-4.8)
  • [Die Java-Tutorials: Generics](https:// docs.oracle.com/javase/tutorial/java/generics/)

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn