In Java kann die Verwendung von Rohtypen bei der Interaktion mit generischen Methoden zu unerwarteten Konsequenzen führen.
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 erfolgreich kompiliert JDK 1.7. Wenn wir jedoch die List-Referenz als Rohtyp deklarieren:
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]);
Wir stoßen auf einen Compilerfehler, der darauf hinweist, dass ein String[] erforderlich ist, aber ein Object[] gefunden wurde.
Dies Das Verhalten ergibt sich aus der Tatsache, dass durch die Verwendung eines Rohtyps für die Listenreferenz die Möglichkeit zur Verwendung von Generika für Instanzmitglieder dieses Typs entfällt. Dies ist nicht auf generische Methoden beschränkt, wie das folgende Beispiel zeigt:
public class MyContainer<T> { public List<String> strings() { return Arrays.asList("a", "b"); } } MyContainer container = new MyContainer<Integer>(); List<String> strings = container.strings(); // gives an unchecked warning!
Dieses Verhalten ist explizit in der Java Language Specification (JLS) angegeben:
Der Typ eines Konstruktors (§ 8.8), Instanzmethode (§8.4, §9.4) oder nicht statisches Feld (§8.3) M eines Rohtyps C, der nicht von seinen Superklassen oder Superschnittstellen geerbt wird, ist der Rohtyp Typ, der der Löschung seines Typs in der generischen Deklaration entspricht, die C entspricht.
Daher sollte die Verwendung von Rohtypen mit Vorsicht erfolgen, da dies bei der Verwendung von generischen Typen zu unerwarteten Einschränkungen und sogar Fehlern bei der Kompilierung führen kann Methoden oder Zugriff auf Instanzmitglieder.
Das obige ist der detaillierte Inhalt vonWarum verursachen Rohtypen Probleme bei der Arbeit mit generischen Methoden in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!