Heim > Java > javaLernprogramm > Warum führt die Verwendung eines Rohtyps mit einer generischen Methode in Java zu unerwartetem Typverhalten?

Warum führt die Verwendung eines Rohtyps mit einer generischen Methode in Java zu unerwartetem Typverhalten?

Patricia Arquette
Freigeben: 2024-11-13 04:53:02
Original
674 Leute haben es durchsucht

Why does using a raw type with a generic method in Java lead to unexpected type behavior?

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]);
Nach dem Login kopieren

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
Nach dem Login kopieren

Ü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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage